一.什么是机器学习?
简单来说,机器学习是一类算法的总称,这些算法企图从大量历史数据中挖掘出其中隐含的规律,并用于预测或者分类,更具体的说,机器学习可以看作是寻找一个函数,输入是样本数据,输出是期望的结果,所以我们可以总结简单抽象机器学习的过程:输入训练数据->机器学习算法->输出结果。
二.机器学习步骤?提出问题.
理解数据
数据清洗
构建模型
评估
三.python中的机器学习工具包scikit-learn
SK-learn中文文档:Introduction · sklearn 中文文档sklearn.apachecn.org
四.相关分析
什么是特征?什么是标签?
比如我们要分析人们对某首歌的喜恶。
特征:特征就是数据的属性,如一首歌的诸多特征:语言,节奏,风格,时长等等。
标签:标签是我们对数据的预测结果,喜恶就是标签。
什么 是训练数据?什么是测试数据?
一般做预测分析时,会将数据分为两大部分。一部分是训练数据,用于构建模型,一部分是测试数据,用于检验模型。有时候模型的构建过程中也需要检验模型,辅助模型构建,所以会将训练数据在分为两个部分:1)训练数据;2)验证数据(Validation Data)。验证数据用于负责模型的构建。具体的是:训练数据(Test Data):用于模型构建;验证数据(Validation Data):可选,用于辅助模型构建,可以重复使用;测试数据(Test Data):用于检测模型构建,此数据只在模型检验时使用,用于评估模型的准确率。绝对不允许用于模型构建过程,否则会导致过渡拟合。
相关分析-简单线性回归:
案例引入:探索学生学习时间和考试成绩的相关关系,通过学习时间来预测学生的考试分数?
通过我们刚刚对特征和标签定义,我们可以知道,在该案例中特征和标签分别对应的是:
特征:学习时间,也就是我们常说的自变量。
标签:分数,也就是我们常说的因变量。
输入该部分数据:
import sklearn
from collections import OrderedDict
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]}
#将eaxmDict转成有序字典
examOrderDict = OrderedDict(eaxmDict)
#将上述有序字典导入Dataframe
examDf = pd.DataFrame(examOrderDict)
#查看数据集前5行
examDf.head()
显然,单纯的表格,数据之间的关系还是没有那么明显,因此,我们考虑将这些数据放在坐标轴上表示出来:
1)提取特征和标签
#特征features
exam_X=examDf.loc[:,'学习时间']
#标签labes
exam_y=examDf.loc[:,'分数']
2)绘制散点图
#绘制散点图
import matplotlib.pyplot as plt
#确定散点图中的X轴和Y轴,scatter是散点图的意思
plt.scatter(exam_X,exam_y,color='b',label='exam ')
#添加图标标签
plt.xlabel('Hours')
plt.ylabel('Score')
#显示图像
plt.show()
3)从上面的散点图,我们可以很本能的猜测,学习时间和分数存在某种正的相关性,学习时间越多,分数越高。
如何统计衡量相关性程度?单纯看图似乎少了什么,我们期望有这样一个指标:
①能够表示两个变量的相关性方向【正线性相关/负线性相关/线性无关】
②能够表示两个标量的相关性大小。
那么,考虑如何构建这个指标呢。
观察上图中,四个象限点的特点,在
处有一条垂直的虚线,在
处有一条虚线,两条线将上图划分为四个象限,第Ⅰ象限的点对应
,第Ⅱ象限点
,以此类推,因此,我们可以发现,
的值在第Ⅰ象限为正,在第Ⅱ象限为负,在第Ⅲ象限为正,在第Ⅳ象限为负。
在统计学中,我们用来表示两个变量间线性关系程度的量叫做:协方差(covariance).对于一个容量为n的样本,其观测值为
,样本的协方差定义如下:
如果
的值是正的,那么对
的值影响最大的点必然在第Ⅰ,Ⅲ象限【
同向变动】,因此,
为正表示x与y之间存在正的线性关系,说明,随着x的增加,y的值也在增加.
如果
的值是负的。对
的值影响最大的点必然在第Ⅱ,Ⅳ象限【
异向变动】,说明 x与y之间存在负的线性关系,随着x的增加,y的值在减少,最后,若各个点在四个象限中分布均匀,则,
的值接近于0,这表示x与y之间不存在线性关系。
协方差有什么缺点?
协方差看似是个衡量相关性的好的指标,但是在使用协方差作为线性关系强度的度量的时候,主要一个问题就是,协方差的值大小,很大程度上依赖于x,y的计量单位,因此我们考虑使用相关系数来对两个变量之间的关系进行度量。
其中:
是样本的相关系数,
是样本协方差,
是变量x的样本标准差,
是变量y的样本标准差。我们知道,样本标准差
是样本各单位标准值
与其平均数
离差平方和的算术平均数的平方根。它反映组内个体间的离散程度【且包含计量单位的影响】。我们用协方差除以变量的标准差,就可以剔除计量单位对系数的影响。
相关系数的三个极值:r=1,完全正相关,r=-1,完全负相关,r=0,线性无关。
4)如何在python中求得两个变量的相关系数:
#相关系数:corr返回结果是一个数据框,存放的是相关系数矩阵
rDf=examDf.corr()
print('相关系数矩阵:')
rDf
相关系数矩阵将很方便看出变量之间的相关关系,有助于我们在面对多个变量在进行特征选择的时候提高选择的有效性。
5)回到我们最初的问题,如何通过学习时间来预计学生的成绩呢,我们期望在之前的散点图存在这一一条直线,它穿过了绝大多数的散点,这样,我们就可以通过这条直线的方程来进行预测了,在回归模型中,我们把这条线,称为最佳拟合线。
6)之后的步骤便是要想方设法得到这条线的相关信息了。上图中公式说我们估计的简单线性回归方程,其中我们把
称为该回归方程的截距,
为回归方程的回归系数,也就是我们熟悉的斜率。如何求和这个的系数
和
呢,我们最常用的方法是最小二乘法,最小二乘法通过使因变量的观测值
与因变量的预测值
之间的离差平方和达到最小,求得
和
的值。
其中,估计回归方程的斜率和y轴的截距为:
7)简单线性回归方程的python实现:
①提取特征和标签
#特征features
exam_X=examDf.loc[:,'学习时间']
#标签labes
exam_y=examDf.loc[:,'分数']
②将数据拆分为训练数据和测试数据。
训练数据用来训练得出回归方程,测试数据用来检验回归方程的好坏。
'''train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取训练数据(train)和测试数据(test)第1个参数:所要划分的样本特征第2个参数:所要划分的样本标签train_size:训练数据占比,如果是整数的话就是样本的数量'''
#导入相关包和模块
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=.8)
#输出数据大小
print('原始数据特征:',exam_X.shape,
',训练数据特征:',X_train.shape,
',测试数据特征:',X_test.shape,)
print('原始数据标签:',exam_y.shape,
',训练数据标签:',y_train.shape,
',测试数据标签:',y_test.shape,)
③绘出散点图:
#绘制散点图
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=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
④训练模型:
'''运行后会报错,因为这里输入的特征只有1个。注意看报错信息,通过这个例子也学会如何分析报错信息'''
#第1步:导入线性回归
from sklearn.linear_model import LinearRegression
# 第2步:创建模型:线性回归
model = LinearRegression()
#第3步:训练模型
model.fit(X_train , y_train)如果你输入的数据只有1个特征,需要用array.reshape(-1, 1)来改变数组的形状What does -1 mean in numpy reshape?stackoverflow.com-1表示我不知道计算该填什么数字,由python通过array的长度和另一个维度参数推测出来。
我们可以做个小实验证明一下:
'''理解了reshape后,我们再来看下线性回归模型sklearn要求输入的特征必须是二维数组的类型,但是因为我们目前只有1个特征,所以需要用安装错误提示用reshape转行成二维数组的类型。错误提示信息:Reshape your data either using array.reshape(-1, 1) if your data has a single feature'''
#将训练数据特征转换成二维数组XX行*1列
X_train=X_train.values.reshape(-1,1)
#将测试数据特征转换成二维数组XX行*1列
X_test=X_test.values.reshape(-1,1)
#第1步:导入线性回归
from sklearn.linear_model import LinearRegression
# 第2步:创建模型:线性回归
model = LinearRegression()
#第3步:训练模型
model.fit(X_train , y_train)
计算出
和
的值:
'''最佳拟合线:y=bo+ 1X截距intercept:b0回归系数:b1'''
#截距
b0=model.intercept_
#回归系数
b1=model.coef_
print('最佳拟合线:截距bo=',b0,',回归系数b1=',b1)
根据所得系数,绘出图形:
#绘图
import matplotlib.pyplot as plt
#训练数据散点图
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=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
对于我们建立得模型,我们怎么才能知道我们模型的好坏呢?我们知道,最小二乘法只能用来得到某个回归模型的回归方程,但是,对于不同回归方程之间的优劣程度,最小二乘法是没有办法进行评判的【可以预见的是,随着数量集的增加,最小二乘法对应准则的公式的值是越来越大的】,因此我们需要找到一个不受数据数量集多少的影响,对不同回归方程进行评估:
上图中,我们可以把SST看作是观测值在直线
周围的聚集程度的度量,把SSE看做是观测值在回归线
周围聚集程度的度量,SST=15730,SSE=1530,所以预计的回归线对样本的数据的拟合要比直线
好。
数据的总波动【总的平方和】:
总波动中回归方程不能解释【误差平方和】:
总波动中回归方程能解释【回归平方和】:
我们将SSR理解为SST的被解释部分,把SSE理解为SST的未被解释的部分。
可以证明:SST=SSR+SSE【化简再利用求和性质】
如果因变量的每一个值
都刚好落到估计的回归直线上,那么估计的回归直线方程将给出一个完全的拟合,这种情况下,对于每一个观测值,
将都等于0,从而导致SSE=0,所以在完全拟合的情况下,SSR/SST=1,最坏的情形下,预测的回归直线完全和代表平均数的直线重合,对于每一个,对于每一个观测值,
将都等于
,从而导致SST=SSE,SSR/SST=0.
由此得到我们的判定系数 :
.
并且由上面的分析, 作为回归方程的判定系数,
值有以下两个功能:
①
可以理解为总平方和中能被估计的回归方程解释的占比。
②
值越大,说明回归模型的精度越高。
在之前所学表示的两个变量之间线性关系强度的相关系数,实际上可以由
推算出:
8)判定系数
的python实现:
#线性回归的scroe方法得到的是判定系数R平方
#评估模型:决定系数R平方
#model是由我们的训练数据得到的,评估模型需要用到我们的测试数据。
R_sq = model.score(X_test , y_test)
'''score内部会对第一个参数X_test用拟合曲线自动计算出y预测值,内容是决定系数R平方的计算过程。所以我们只用根据他的要求输入参数即可。'''
R_sq
判定系数
接近89%,意味着我们模型的准确性较高。
'''下面绘图的目的是为了:把训练数据集(图中蓝色的点),和测试数据集(图中红色的点)放到一张图上来比较看'''
#导入绘图包
import matplotlib.pyplot as plt
'''第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=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
期望是什么:数学期望_百度百科baike.baidu.com
协方差是什么?:协方差_百度百科baike.baidu.com
什么是方差?方差_百度百科baike.baidu.com
为什么样本方差(sample variance)的分母是 n-1?为什么样本方差(sample variance)的分母是 n-1?www.zhihu.com