[机器学习介绍与定义]机器学习-part1
一、 机器学习介绍与定义
1. 机器学习定义
机器学习(Machine Learning)本质上就是让计算机自己在数据中学习规律,并根据所得到的规律对未来数据进行预测。
机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep Learning)等算法。
机器学习的基本思路是模仿人类学习行为的过程,如我们在现实中的新问题一般是通过经验归纳,总结规律,从而预测未来的过程。
2. 机器学习的发展历史
从机器学习发展的过程上来说,其发展的时间轴如下所示:
从上世纪50年代的图灵测试提出、塞缪尔开发的西洋跳棋程序,标志着机器学习正式进入发展期。
60年代中到70年代末的发展几乎停滞。
80年代使用神经网络反向传播(BP)算法训练的多参数线性规划(MLP)理念的提出将机器学习带入复兴时期。
90年代提出的“决策树”(ID3算法),再到后来的支持向量机(SVM)算法,将机器学习从知识驱动转变为数据驱动的思路。
21世纪初Hinton提出深度学习(Deep Learning),使得机器学习研究又从低迷进入蓬勃发展期。
从2012年开始,随着算力提升和海量训练样本的支持,深度学习(Deep Learning)成为机器学习研究热点,并带动了产业界的广泛应用。
3. 机器学习分类
这里按学习模式的不同,可分为监督学习、半监督学习、无监督学习和强化学习。
3.1 监督学习
在监督学习中,模型是通过一个带有标记的训练数据集来学习的。这个训练数据集包含输入数据(特征)和对应的目标输出(标签)。模型的任务就是找到输入和输出之间的映关系射,从而能够对新的、未见过的输入数据进行准确的预测。就好比有一个老师(监督者)在监督学习过程,告诉每个模型输入对应的正确输出应该是什么。
监督学习主要用于回归和分类。
常见的监督学习的回归算法有线性回归、回归树、K邻近、Adaboost、神经网络等。
常见的监督学习的分类算法有朴素贝叶斯、决策树、SVM、逻辑回归、K邻近、Adaboost、神经网络等。
3.2 半监督学习
半监督学习介于监督学习和无监督学习之间。它使用了少量的标记数据和大量的未标记数据来训练模型。这是因为现实场景中,获取大量标记数据往往成本很高,而未标记数据相对容易获得。半监督学习试图利用未标记数据中的潜在结构信息来提高模型的性能。
半监督学习侧重于在有监督的分类算法中加入无标记样本来实现半监督分类。
常见的半监督学习算法有Pseudo-Label、Π-Model、Temporal Ensembling、Mean Teacher、VAT、UDA、MixMatch、ReMixMatch、FixMatch等。
3.3 无监督学习
无监督学习是在没有标记数据的情况下对数据进行学习。模型的任务是探索的数据内在结构、分布模式或者特征表示等。就好像让模型自己去发现数据中的规律,而没有一个预先设定的正确答案来指导。
无监督学习主要用于关联分析、聚类和降维。
常见的无监督学习算法有稀疏自编码(Sparse Auto-Encoder)、主成分分析(Principal Component Analysis, PCA)、K-Means算法(K均值算法)、DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)、最大期望算法(Expectation-Maximization algorithm, EM)等。
3.4 强化学习
强化学习是一种通过智能体(agent)与环境(environment)进行交互来学习的行为模式。智能体在环境中采取一系列动作,环境会根据这些动作给出奖励或惩罚信号,智能体的目标是学习一种策略,使得它在长期过程中获得的累积奖励最大化。这就好比一个人在学习走路,他不断尝试迈出脚步(动作),如果他成功地走稳了就会得到奖励(比如妈妈的夸奖),如果摔倒了就会受到惩罚(比如疼痛),通过不断地尝试和调整,他学会了走路的最佳方式(策略)
在强化学习中,有两个可以进行交互的对象:智能体(Agnet)和环境(Environment),还有四个核心要素:策略(Policy)、回报函数(收益信号,Reward Function)、价值函数(Value Function)和环境模型(Environment Model),其中环境模型是可选的。
强化学习常用于机器人避障、棋牌类游戏、广告和推荐等应用场景中。
4. 机器学习需要具备的基础的知识,如何学习机器学习
机器学习涉及到线性代数、微积分、概率和统计。
学习机器学习需要掌握一定的数学和编程基础。以下是一些建议,帮助您开始学习机器学习:
学习数学基础:了解线性代数、概率论和统计学等数学概念。这些概念在机器学习中非常重要,可以帮助您理解算法和模型背后的原理。
学习编程语言:掌握至少一种常用的编程语言,如Python或R。这些语言在机器学习中广泛使用,具有丰富的机器学习库和工具。
学习机器学习算法:了解常见的机器学习算法,如线性回归、决策树、支持向量机、神经网络等。学习它们的原理、应用和优缺点。
学习机器学习工具和框架:熟悉常用的机器学习工具和框架,如scikit-learn、TensorFlow、PyTorch等。掌握它们的使用方法和基本操作。
实践项目:通过实践项目来应用所学的知识。选择一些小型的机器学习项目,从数据收集和预处理到模型训练和评估,逐步提升自己的实践能力。
学习资源:利用在线教程、课程、书籍和开放资源来学习机器学习。有很多免费和付费的学习资源可供选择,如Coursera、Kaggle、GitHub上的机器学习项目等。
参与机器学习社区:加入机器学习社区,与其他学习者和专业人士交流经验和学习资源。参与讨论、阅读博客、参加线下活动等,扩展自己的学习网络。
持续学习和实践:机器学习是一个不断发展的领域,保持学习的态度并持续实践非常重要。跟随最新的研究成果、参与竞赛和项目,不断提升自己的技能。
记住,机器学习是一个广阔的领域,需要不断的学习和实践才能掌握。持续投入时间和精力,逐步积累经验和知识,便会逐渐掌握机器学习的技能。
5 机器学习的应用场合
-
图像识别与处理
-
图像分类 :能够对不同类型的图像进行分类,例如在医疗影像诊断中,对 X 光片、CT 图像等进行分析,自动识别出正常和异常(如肿瘤、骨折等)图像。在安防领域,对监控摄像头拍摄的图像进行实时分析,识别出可疑人员或行为模式。
-
目标检测与定位 :用于检测和定位图像中的特定物体。比如在自动驾驶汽车中,通过摄像头捕捉图像,实时检测道路上的行人、车辆、交通标志等物体的位置和大小,为自动驾驶决策提供依据。在物流行业,对仓库货架上的商品进行识别和定位,方便机器人进行货物的搬运和盘点。
-
图像分割 :将图像分割成不同的区域或部分,可用于医学影像分析中对不同组织和器官的分割,帮助医生更精准地了解病变范围。在遥感图像分析中,对土地利用类型(如农田、森林、城市等)进行分割识别。
-
-
自然语言处理(NLP)
-
文本分类 :包括垃圾邮件过滤,将收到的邮件自动分类为垃圾邮件或正常邮件。还可以对新闻文章进行分类,按照主题(如体育、科技、财经等)自动归类。
-
情感分析 :用于分析文本中表达的情感倾向,如对产品评论、电影评论等进行分析,判断用户是持正面、负面还是中立的态度。这在市场营销领域可以帮助企业了解消费者对产品的反馈。
-
机器翻译 :将一种自然语言文本自动翻译成另一种自然语言文本,如谷歌翻译等在线翻译工具,方便人们跨语言交流。
-
语音识别与合成 :将语音信号转换为文字(语音识别),如智能语音助手(如苹果的 Siri、亚马逊的 Alexa)可以理解用户的语音指令。同时,也能将文字合成为语音(语音合成),用于导航软件、阅读辅助工具等。
-
-
金融领域
-
信用评估 :银行和其他金融机构利用机器学习模型分析客户的信用记录、收入、支出等数据,评估客户的信用风险,决定是否为其提供贷款以及贷款的额度和利率。
-
欺诈检测 :通过分析交易数据、用户行为模式等,识别出异常的交易行为,检测信用卡欺诈、保险欺诈等。例如,当一笔交易的金额、交易地点等特征与用户以往的正常交易模式不符时,机器学习模型会发出警报。
-
投资决策辅助 :分析历史市场数据、公司财务报表等信息,预测股票、债券等金融资产的价格走势,为投资者提供决策参考。
-
-
工业制造
-
质量检测 :利用机器视觉技术结合机器学习模型,对生产线上的产品进行自动检测,识别出外观缺陷、尺寸偏差等问题,提高产品质量和生产效率。例如,在电子产品制造中,检测电路板上的芯片是否正确安装,焊点是否合格。
-
设备故障预测与维护 :收集设备运行过程中的各种传感器数据,如温度、压力、振动等,通过机器学习算法预测设备可能出现故障的时间,提前安排维护保养,减少设备停机时间,降低维护成本。
-
-
市场营销与客户关系管理(CRM)
-
客户细分 :根据客户的购买行为、偏好、人口统计学特征等数据,将客户划分为不同的群体,以便企业能够针对不同群体制定个性化的营销策略。例如,将客户分为高价值客户、潜在客户、流失风险客户等。
-
个性化推荐 :电商平台根据用户的浏览历史、购买记录等数据,利用机器学习算法为用户推荐他们可能感兴趣的商品,提高用户的购买转化率和满意度。视频和音乐流媒体平台也会为用户推荐个性化的视频和音乐内容。
-
-
交通与物流
-
交通流量预测与管理 :分析历史交通数据(如车流量、路况、天气等),预测交通流量的变化,为交通管理部门制定交通疏导方案提供依据。同时,在智能交通系统中,可以通过实时数据调整交通信号灯的时长,优化交通流量。
-
物流路径优化 :根据货物的起始地、目的地、运输车辆的载重、路况等信息,运用机器学习算法规划最优的物流运输路径,降低成本、提高配送效率。
-
-
教育领域
-
学生学习分析与个性化教学 :通过分析学生的学习行为数据(如作业完成情况、考试成绩、课堂参与度等),了解学生的学习进度和知识掌握情况,为学生提供个性化的学习建议和教学内容。例如,智能辅导系统可以根据学生对不同知识点的掌握程度,推送相应的练习题和讲解视频。
-
教育资源推荐 :根据学校的课程设置、学生的特点等因素,为教师推荐合适的教学资源,如教材、课件、教学案例等。
-
6. 机器学习趋势分析
机器学习正真开始研究和发展应该从80年代开始,深度神经网络(Deep Neural Network)、强化学习(Reinforcement Learning)、卷积神经网络(Convolutional Neural Network)、循环神经网络(Recurrent Neural Network)、生成模型(Generative Model)、图像分类(Image Classification)、支持向量机(Support Vector Machine)、迁移学习(Transfer Learning)、主动学习(Active Learning)、特征提取(Feature Extraction)是机器学习的热点研究。
以深度神经网络、强化学习为代表的深度学习相关的技术研究热度上升很快,近几年仍然是研究热点。
7. 机器学习项目开发步骤
有5个基本步骤用于执行机器学习任务:
-
收集数据:无论是来自excel,access,文本文件等的原始数据,这一步(收集过去的数据)构成了未来学习的基础。相关数据的种类,密度和数量越多,机器的学习前景就越好。
-
准备数据:任何分析过程都会依赖于使用的数据质量如何。人们需要花时间确定数据质量,然后采取措施解决诸如缺失的数据和异常值的处理等问题。探索性分析可能是一种详细研究数据细微差别的方法,从而使数据的质量迅速提高。
-
练模型:此步骤涉及以模型的形式选择适当的算法和数据表示。清理后的数据分为两部分 - 训练和测试(比例视前提确定); 第一部分(训练数据)用于开发模型。第二部分(测试数据)用作参考依据。
-
评估模型:为了测试准确性,使用数据的第二部分(保持/测试数据)。此步骤根据结果确定算法选择的精度。检查模型准确性的更好测试是查看其在模型构建期间根本未使用的数据的性能。
-
提高性能:此步骤可能涉及选择完全不同的模型或引入更多变量来提高效率。这就是为什么需要花费大量时间进行数据收集和准备的原因。
二、scikit-learn工具介绍
-
Python语言机器学习工具
-
Scikit-learn包括许多智能的机器学习算法的实现
-
Scikit-learn文档完善,容易上手,丰富的API接口函数
-
Scikit-learn官网:scikit-learn: machine learning in Python — scikit-learn 1.6.1 documentation
-
Scikit-learn中文文档:sklearn
-
scikit-learn中文社区
1 scikit-learn安装
conda create -n python-scikit-learn python=3.9
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
2 Scikit-learn包含的内容
三 数据集
1 sklearn玩具数据集介绍
数据量小,数据在sklearn库的本地,只要安装了sklearn,不用上网就可以获取
2 sklearn现实世界数据集介绍
数据量大,数据只能通过网络获取
3 sklearn加载玩具数据集
示例1:鸢尾花数据
from sklearn.datasets import load_iris iris = load_iris()#鸢尾花数据
鸢尾花数据集介绍
特征有:
花萼长 sepal length
花萼宽sepal width
花瓣长 petal length
花瓣宽 petal width
三分类:
0-Setosa山鸢尾
1-versicolor变色鸢尾
2-Virginica维吉尼亚鸢尾
from sklearn.datasets import load_iris iris = load_iris() #返回一个Bunch对象
iris字典中有几个重要属性:
# data 特征 # feature_names 特征描述 # target 目标 # target_names 目标描述 # DESCR 数据集的描述 # filename 下后到本地保存后的文件名
print(iris.data)#得到特征 print(iris.feature_names) #特征描述 print(iris.target) #目标形状 print(iris.target_names)#目标描述 print(iris.filename) #iris.csv 保存后的文件名 print(iris.DESCR)#数据集的描述
下面使用pandas把特征和目标一起显示出来
import pandas as pd import numpy as np from sklearn.datasets import load_iris iris = load_iris() feature = iris.data target = iris.target target.shape=(len(target), 1) data = np.hstack([feature, target]) cols = iris.feature_names cols.append("target") pd.DataFrame(data,columns=cols)
示例2:分析糖尿病数据集
这是回归数据集,有442个样本,有可能就有442个目标值。
import pandas as pd import numpy as np from sklearn.datasets import load_iris iris = load_iris() feature = iris.data target = iris.target target.shape=(len(target), 1) data = np.hstack([feature, target]) cols = iris.feature_names cols.append("target") pd.DataFrame(data,columns=cols)
4 sklearn获取现实世界数据集
(1)所有现实世界数据,通过网络才能下载后,默认保存的目录可以使用下面api获取。实际上就是保存到home目录
from sklearn import datasets datasets.get_data_home() #查看数据集默认存放的位置
(2)下载时,有可能回为网络问题而出问题,要“小心”的解决网络问题,不可言…..
(3)第一次下载会保存的硬盘中,如果第二次下载,因为硬盘中已经保存有了,所以不会再次下载就直接加载成功了。
示例:获取20分类新闻数据
(1)使用函数: sklearn.datasets.fetch_20newsgroups(data_home,subset)
(2)函数参数说明:
(2.1) data_home
None这是默认值,下载的文件路径为 “C:/Users/ADMIN/scikit_learn_data/20news-bydate_py3.pkz” 自定义路径例如 “./src”, 下载的文件路径为“./20news-bydate_py3.pkz”
(2.2) subset
“train”,只下载训练集 “test”,只下载测试集 “all”, 下载的数据包含了训练集和测试集
(2.3) return_X_y,决定着返回值的情况
False,这是默认值 True,
(3) 函数返值说明:
当参数return_X_y值为False时, 函数返回Bunch对象,Bunch对象中有以下属性*data:特征数据集, 长度为18846的列表list, 每一个元素就是一篇新闻内容, 共有18846篇*target:目标数据集,长度为18846的数组ndarray, 第一个元素是一个整数,整数值为[0,20)*target_names:目标描述,长度为20的list*filenames:长度为18846的ndarray, 元素为字符串,代表新闻的数据位置的路径当参数return_X_y值为True时,函数返回值为元组,元组长度为2, 第一个元素值为特征数据集,第二个元素值为目标数据集
代码
from sklearn.datasets import fetch_20newsgroups #这是一个20分类的数据 news = fetch_20newsgroups(data_home=None,subset='all') print(len(news.data)) #18846 print(news.target.shape) #(18846,) print(len(news.target_names)) #20 print(len(news.filenames)) #18846
5 本地csv数据
(1) 创建csv文件
方式1:打开计事本,写出如下数据,数据之间使用英文下的逗号, 保存文件后把后缀名改为csv
csv文件可以使用excel打开
, milage,Liters,Consumtime,target 40920,8.326976,0.953952,3 14488,7.153469,1.673904,2 26052,1.441871,0.805124,1 75136,13.147394,0.428964,1
方式2:创建excel 文件, 填写数据,以csv为后缀保存文件
(2) pandas加载csv
使用pandas的read_csv(“文件路径”)函数可以加载csv文件,得到的结果为数据的DataFrame形式
pd.read_csv("./src/ss.csv")
6 数据集的划分
""" 1. 复习不定长参数 一个"*" 把多个参数转为元组 两个"*" 把多个关键字参数转为字典 """ def m(*a, **b):print(a) #('hello', 123)print(b) #{'name': '小王', 'age': 30, 'sex': '男'} m("hello", 123, name="小王", age=30, sex="男") 2. 复习列表值的解析 list = [11,22,33] a, b, c = list # a=11 b=22 c=33 a, b = ["小王", 30] #a="小王" b=30
(1) 函数
sklearn.model_selection.train_test_split(*arrays,**options) 参数 (1) *array 这里用于接收1到多个"列表、numpy数组、稀疏矩阵或padas中的DataFrame"。 (2) **options, 重要的关键字参数有:test_size 值为0.0到1.0的小数,表示划分后测试集占的比例random_state 值为任意整数,表示随机种子,使用相同的随机种子对相同的数据集多次划分结果是相同的。否则多半不同strxxxx 分层划分,填y 2 返回值说明返回值为列表list, 列表长度与形参array接收到的参数数量相关联, 形参array接收到的是什么类型,list中对应被划分出来的两部分就是什么类型
(2)示例
列表数据集划分
x = [10,20,30,40,50,60,70,80,90,100]
x_train,x_test = train_test_split(x,test_size=0.2,shuffle=True)
print(x_train)
print("=============================")
print(x_test)
train_test_split里面的test_size可以为小数(0.几),或者整数,小数代表百分比,整数代表多少个。
x = [10,20,30,40,50,60,70,80,90,100]
y = [1,2,3,4,5,6,7,8,9,10]
x_train,x_test,y_train,y_test = train_test_split(x,y)
print(x_train,x_test)
print("=============================")
print(y_train,y_test)
这里可以得知随机数种子一样,
ndarray数据集划分
划分前和划分后的数据类型是相同的 data1为list,划分后的a、b也是list data2为ndarray,划分后的c、d也是ndarray
from sklearn.model_selection import train_test_split import numpy as np data1 = [1, 2, 3, 4, 5] data2 = np.array(["1a", "2a","3a", "4a", "5a"]) a, b, c, d = train_test_split(data1, data2, test_size=0.4, random_state=22) print(a, b, c, d) #[4, 1, 5] [2, 3] ['4a' '1a' '5a'] ['2a' '3a'] print(type(a), type(b), type(c), type(d)) #<class 'list'> <class 'list'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>
二维数组数据集划分
train_test_split只划分第一维度,第二维度保持不变
from sklearn.model_selection import train_test_split import numpy as np data1 = np.arange(1, 16, 1) data1.shape=(5,3) print(data1) a, b = train_test_split(data1, test_size=0.4, random_state=22) print("a=\n", a) print("b=\n", b)
[[ 1 2 3][ 4 5 6][ 7 8 9][10 11 12][13 14 15]] a=[[10 11 12][ 1 2 3][13 14 15]] b=[[4 5 6][7 8 9]]
DataFrame数据集划分
可以划分DataFrame, 划分后的两部分还是DataFrame
from sklearn.model_selection import train_test_split import numpy as np import pandas as pd data1 = np.arange(1, 16, 1) data1.shape=(5,3) data1 = pd.DataFrame(data1, index=[1,2,3,4,5], columns=["one","two","three"]) print(data1) a, b = train_test_split(data1, test_size=0.4, random_state=22) print("\n", a) print("\n", b)
one two three 1 1 2 3 2 4 5 6 3 7 8 9 4 10 11 12 5 13 14 15 one two three 4 10 11 12 1 1 2 3 5 13 14 15 one two three 2 4 5 6 3 7 8 9
字典数据集划分
可以划分非稀疏矩阵
用于将字典列表转换为特征向量。这个转换器主要用于处理类别数据和数值数据的混合型数据集
1.对于类别特征DictVectorizer
会为每个不同的类别创建一个新的二进制特征,如果原始数据中的某个样本具有该类别,则对应的二进制特征值为1,否则为0。
2.对于数值特征保持不变,直接作为特征的一部分
这样,整个数据集就被转换成了一个适合机器学习算法使用的特征向量形式
from sklearn.feature_extraction import DictVectorizer data = [{'city':'成都', 'age':30, 'temperature':20}, {'city':'重庆','age':33, 'temperature':60}, {'city':'北京', 'age':42, 'temperature':80},{'city':'上海', 'age':22, 'temperature':70},{'city':'成都', 'age':72, 'temperature':40},] transfer = DictVectorizer(sparse=True) data_new = transfer.fit_transform(data) print("data_new:\n", data_new) x = data_new.toarray() print(type(x)) print(x)
#(0,0)是矩阵的行列下标 30是值 data_new:(0, 0) 30.0(0, 3) 1.0(0, 5) 20.0(1, 0) 33.0(1, 4) 1.0(1, 5) 60.0(2, 0) 42.0(2, 2) 1.0(2, 5) 80.0(3, 0) 22.0(3, 1) 1.0(3, 5) 70.0(4, 0) 72.0(4, 3) 1.0(4, 5) 40.0 <class 'numpy.ndarray'> # 第一行中:30表示age的值 0表示上海 0表示北京 1表示成都 0表示重庆 20表示temperature [[30. 0. 0. 1. 0. 20.][33. 0. 0. 0. 1. 60.][42. 0. 1. 0. 0. 80.][22. 1. 0. 0. 0. 70.][72. 0. 0. 1. 0. 40.]]
a, b = train_test_split(data_new, test_size=0.4, random_state=22) print(a) print("\n", b)
(0, 0) 22.0(0, 1) 1.0(0, 5) 70.0(1, 0) 30.0(1, 3) 1.0(1, 5) 20.0(2, 0) 72.0(2, 3) 1.0(2, 5) 40.0 (0, 0) 33.0(0, 4) 1.0(0, 5) 60.0(1, 0) 42.0(1, 2) 1.0(1, 5) 80.0
#data_new.toarray()是ndarray a, b = train_test_split(data_new.toarray(), test_size=0.4, random_state=22) print(a) print("\n", b)
[[22. 1. 0. 0. 0. 70.][30. 0. 0. 1. 0. 20.][72. 0. 0. 1. 0. 40.]] [[33. 0. 0. 0. 1. 60.][42. 0. 1. 0. 0. 80.]]
鸢尾花数据集划分
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split iris = load_iris() list = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22) #x_train训练特征数据集,x_test测试特征数据集, y_train训练目标数据集,y_test测试目标数据集, x_train, x_test, y_train, y_test = list #打印结果为: (120, 4) (30, 4) (120,) (30,) print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
现实世界数据集划分
from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split import numpy as np news = fetch_20newsgroups(data_home=None, subset='all') list = train_test_split(news.data, news.target,test_size=0.2, random_state=22) # """ # 返回值是一个list:其中有4个值,分别为训练集特征、测试集特征、训练集目标、测试集目标 # 与iris相同点在于x_train和x_test是列表,而iris是 # """ x_train, x_test, y_train, y_test = list #打印结果为: 15076 3770 (15076,) (3770,) print(len(x_train), len(x_test), y_train.shape, y_test.shape)