最新全套【Python入门到进阶资料 & 实战源码 &安装工具】(安全链接,放心点击)
一、什么是机器学习
什么是机器学习?机器学习其实就是想让计算机像人一样思考而研发出的计算机理论,目前常用的机器学习有以下几种算法:
- 监督学习 supervised learning;
- 非监督学习 unsupervised learning;
- 半监督学习 semi-supervised learning;
- 强化学习 reinforcement learning;
监督学习是不断向计算机提供数据(特征),并告诉计算机对应的值(标签),最后通过大量的数据,让计算机自己学会判断和识别。例如Google Photo,你在APP中输入狗,这时就会弹出与狗相关的图片,这背后使用的算法就是监督学习。通过告诉计算机狗长什么样(特征),最后教会计算机认识狗(标签)。再比如今日头条,你使用APP的时间越长,给你推送的内容就越是你平时感兴趣的内容。通过对用户平时日常使用数据(特征)的分析,找到用户的兴趣爱好(标签),进而更精准的推送内容。
非监督学习与监督学习的区别是,只向计算机提供数据(特征),但并不提供对应的值(标签)。例如需要计算机学会识别猫和狗,这时仅提供猫和狗的图片(特征),但是并不告诉计算机,哪些图片是猫,哪些图片是狗,让计算机自己去总结归纳出两者的特征规律。
半监督学习是综合了监督学习和非监督学习两者的特点,利用少量有标签的样本,和大量没有标签的样本对计算机进行训练。
强化学习是将计算机放入一个陌生的环境中,让它自己去学习,其中包含了4个关键要素,分别是环境(environment)、状态(state)、行动(action)和奖励(reward)。例如要设计一款自动投篮机器,首先让机器自己去选择投篮的角度、力度等动作进行尝试,告诉机器如果投篮命中便能获得奖励,之后机器会根据练习所产生的数据,不断修改自身的动作策略,经过数次迭代之后,学习并完成投篮任务。战胜李世石的AlphaGo,所使用的就是强化学习。强化学习与监督学习和非监督学习最大的不同是,不需要使用海量的数据去“喂养”机器,而是通过不断地尝试去获取数据。
使用Python进行机器学习时,都会用到一个非常强大的第三方包,那就是scikit-learn。
Sklearn包含了四类算法,分别是回归(regression)、分类(classification)、聚类(clustering)和降维(dimensionality reduction)。其中回归和分类是监督式学习,下面使用Python对简单线性回归和逻辑回归分类进行简要介绍。
二、简单线性回归
线性回归(linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
简单线性回归方程其实就像我们初中学习的二元一次方程:y=a+bx
其中a称作截距,b称作回归系数,x为自变量,y为因变量。
简单线性回归分析通常包含以下步骤:
- 提出问题
- 理解数据
- 数据清洗
- 构建模型
- 评估模型
1.提出问题
假设现在提出一个问题,通过收集学生学习时间和分数,得出学习时间与分数之间的相关关系,其中特征为学习时间,标签为分数。
2.理解数据
采集所需的数据,并导入Python。
import pandas as pd
examDict = {
'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,
2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
'分数':[10, 22, 13, 43, 20, 22, 33, 50, 62,
48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]}
examDf = pd.DataFrame(examDict)
print(examDf.head())
学习时间 分数
0 0.50 10
1 0.75 22
2 1.00 13
3 1.25 43
4 1.50 20
#提取特征和标签
#特征features
exam_X=examDf.loc[:,'学习时间']
#标签labes
exam_y=examDf.loc[:,'分数']
#绘制散点图
import matplotlib.pyplot as plt
plt.scatter(exam_X,exam_y,color='b',label='exam data')
#添加图标标签
plt.xlabel('Hours') #X轴命名
plt.ylabel('Score') #Y轴命名
print(plt.show())
通过观察上面的散点图,我们可以对相关性做出初步的分析。相关性通常有3种情况,正线性相关、负线性相关和非线性相关。当线性回归方程中的回归系数b大于0,即直线朝上时,为正线性相关,回归系数b小于0,即直线朝下时,为负线性相关。我们还可以通过计算相关系数r,对相关性大小进行判断。相关系数公式如下:
#计算相关系数r
rDf = examDf.corr()
print('相关系数矩阵:\n',rDf)
print('相关系数r=',rDf.iloc[0,1])
相关系数矩阵:
学习时间 分数
学习时间 1.000000 0.923985
分数 0.923985 1.000000
相关系数r= 0.9239852119728443
3.数据清洗
本案例中数据较为简单,主要是为了介绍简单线性回归的操作过程,具体的步骤可查看,Python入门之Numpy与Pandas中的数据清洗一节。
4.构建模型
利用交叉验证函数中的train_test_split()进行建模分析。交叉验证是指:
交叉验证(Cross Validation)也称作循环估计(Rotation Estimation),是一种统计学上将数据样本切割成较小子集的实用方法。在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预测。交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。
①创建模型
利用sklearn中train_test_split方法进行数据分割,将数据随机分成训练数据和测试数据,占比为8:2。
from sklearn.model_selection import train_test_split
#建立训练数据和测试数据
X_train,X_test,y_train,y_test = train_test_split(exam_X,exam_y,train_size=0.8) #train_size指训练数据占比
#输出数据大小
print('原始数据特征:',exam_X.shape,
'训练数据特征:',X_train.shape,
'测试数据特征:',X_test.shape)
print('原始数据标签:',exam_y.shape,
'训练数据标签:',y_train.shape,
'测试数据标签:',y_test.shape)
原始数据特征: (20,) 训练数据特征: (16,) 测试数据特征: (4,)
原始数据标签: (20,) 训练数据标签: (16,) 测试数据标签: (4,)
#绘制散点图
import matplotlib.pyplot as plt
#散点图
plt.scatter(X_train, y_train, color="blue", label="train data")
plt.scatter(X_test, y_test, color="red", label="test data")
#添加图标标签
plt.legend(loc=4) #设置图签的位置
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
②训练模型
#第1步:导入线性回归第三方包
from sklearn.linear_model import LinearRegression
#第2步:创建线性回归模型
model = LinearRegression()
#将训练数据特征和测试数据特征转换成二维数组
'''
reshape是重新定义行数和列数。如果行的参数是-1,就会根据所给的列数,
自动按照原始数组的大小形成一个新的数组,例如reshape(-1,1)就是改变
成1列的数组,这个数组的长度是根据原始数组的大小来自动形成的。
例如原始数组总共是2行*3列=6个数,那么这里就会形成6行*1列的数组。
'''
X_train = X_train.values.reshape(-1,1)
X_test = X_test.values.reshape(-1,1)
#第3步:训练模型
model.fit(X_train,y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
③计算最佳拟合线
最佳拟合线:y= + x,截距intercept:a,回归系数:b
回归分析求最佳拟合线的常用方法为最小二乘法,通过最小二乘法,可以使得误差平方和最小,进而求出a和b的值。 这个数学问题过于复杂,如果想知道证明的原理可自行搜索学习。误差平方和的计算公式为:
#截距
a = model.intercept_
b = model.coef_
print('最佳拟合线:y=%f+%fx'%(a,b))
最佳拟合线:y=10.251797+15.840256x
#绘制训练数据散点图
plt.scatter(X_train, y_train, color='blue', label="train data")
#训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线
plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
#添加图标标签
plt.legend(loc=4)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
5.模型评估
要想评估模型的精确度,可以使用决定系数R平方进行判断,R平方越大,表明回归模型越精确。使用测试数据进行模型评估,利用score方法,对第一个参数X_test用拟合曲线自动计算出y预测值。决定系数R平方计算公式如下:
#线性回归的scroe方法得到的是决定系数
#评估模型:决定系数
r2 = model.score(X_test , y_test)
print(r2)
0.8823686336975715
把训练数据集(图中蓝色的点),和测试数据集(图中红色的点)放到一张图上来进行比较,并在图上标注出决定系数R平方。
#第1步:绘制训练数据散点图
plt.scatter(X_train, y_train, color='blue', label="train data")
#第2步:用训练数据绘制最佳拟合线
#最佳拟合线训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
#第3步:绘制测试数据的散点图
plt.scatter(X_test, y_test, color='red', label="test data")
#添加图标标签
plt.legend(loc=4)
plt.xlabel("Hours")
plt.ylabel("Score")
plt.show()
三、逻辑回归
逻辑回归(Logistic Regression)主要用来解决二分类问题,表示某件事情发生的可能性。什么是二分类呢,说简单点就是答案只有Yes和No两种可能。逻辑回归和线性回归一样,在机器算法中都属于监督学习,但是逻辑回归在Sklearn的4类算法中属于分类算法。
逻辑回归的公式如下:
逻辑函数图像如下:
可以看到,逻辑回归函数是一个s形的曲线,取值在[0,1]之间,在远离0的地方函数的值会很快接近0或者1。通常可以选择0.5作为阈值,划定一个决策面,当y>=0.5时,确定标签为1,当y<0.5时,确定标签为0。例如之前所举的今日头条的例子,就可以通过逻辑回归去找到关于用户喜好程度的决策面,通过下图可以帮助理解决策面的含义。
利用Python进行逻辑回归分析的方法与简单线性回归分析的步骤一致,同样是包括提出问题、理解问题、数据清洗、构建模型、模型评估5步。
1.提出问题
假设现在提出一个问题,通过收集学生学习时间和通过考试情况,得出学习时间与通过考试之间的相关关系,其中特征为学习时间,标签为通过考试。
2.理解数据
采集所需的数据,并导入Python。
import pandas as pd
#采集数据
exam2Dict = {
'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,
2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
'通过考试':[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]}
examDf = pd.DataFrame(exam2Dict)
print(examDf)
学习时间 通过考试
0 0.50 0
1 0.75 0
2 1.00 0
3 1.25 0
4 1.50 0
5 1.75 0
6 1.75 1
7 2.00 0
8 2.25 1
9 2.50 0
10 2.75 1
11 3.00 0
12 3.25 1
13 3.50 0
14 4.00 1
15 4.25 1
16 4.50 1
17 4.75 1
18 5.00 1
19 5.50 1
#特征features
exam2_X = examDf.loc[:,'学习时间']
exam2_y = examDf.loc[:,'通过考试']
#绘制散点图
import matplotlib.pyplot as plt
plt.scatter(exam2_X,exam2_y,color='b',label='exam data')
#添加图标标签
plt.xlabel('Hours') #X轴命名
plt.ylabel('Pass') #Y轴命名
print(plt.show())
3.数据清洗
本案例中数据较为简单,主要是为了介绍逻辑回归的操作过程,此步暂时省略。
4.创建模型
与线性回归创建模型一样,同样利用sklearn中train_test_split方法进行数据分割,将数据随机分成训练数据和测试数据,占比为8:2。
①创建模型
from sklearn.model_selection import train_test_split
#建立训练数据和测试数据
X_train,X_test,y_train,y_test = train_test_split(exam2_X,exam2_y,train_size=0.8) #train_size指训练数据占比
#输出数据大小
print('原始数据特征:',exam2_X.shape,
'训练数据特征:',X_train.shape,
'测试数据特征:',X_test.shape)
print('原始数据标签:',exam2_y.shape,
'训练数据标签:',y_train.shape,
'测试数据标签:',y_test.shape)
原始数据特征: (20,) 训练数据特征: (16,) 测试数据特征: (4,)
原始数据标签: (20,) 训练数据标签: (16,) 测试数据标签: (4,)
#绘制散点图
import matplotlib.pyplot as plt
#散点图
plt.scatter(X_train, y_train, color="blue", label="train data")
plt.scatter(X_test, y_test, color="red", label="test data")
#添加图标标签
plt.legend(loc=4) #设置图签的位置
plt.xlabel("Hours")
plt.ylabel("Pass")
#显示图像
plt.show()
②训练模型
#第1步:导入逻辑回归
from sklearn.linear_model import LogisticRegression
#第2步:创建模型:逻辑回归
model = LogisticRegression()
X_train = X_train.values.reshape(-1,1)
X_test = X_test.values.reshape(-1,1)
#第3步:训练模型
model.fit(X_train,y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept