机器学习入门:① 提出问题 ② 理解数据 ③ 数据清洗 ④ 构建模型 ⑤ 评估
python机器学习包:sklearn
一、相关性分析
相关性分析:研究2种或2种以上的数据之间有什么关系。比如身高和体重,工作和疾病发病率等。
- 三种线性相关性:
![1afd1bad1c609d5d0fd9060d2fd5adb0.png](https://i-blog.csdnimg.cn/blog_migrate/bae4bfe8a09db38d75877558013329e6.jpeg)
二、协方差
我们先来看下两个变量 同方向变化 和 反方向变化 情况
同方向变化:
![3903df804bfcf15ef945293046ed7d4d.png](https://i-blog.csdnimg.cn/blog_migrate/21b20a68fb30f502d0f1c0c5e1e3544d.jpeg)
反方向变化:
![d45c6515a1872c4e7c5cecc705e49085.png](https://i-blog.csdnimg.cn/blog_migrate/06012d2d067d6de051c5a95658c16928.jpeg)
因此 协方差:
协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。
公式:
![c2f3f77036139bbd1f1d086e79edd291.png](https://i-blog.csdnimg.cn/blog_migrate/53d3eea3988d536357ef8e531729c919.jpeg)
协方差的意义:
① 表示两个变量的相关性方向(协方差>0,正线性相关;协方差<0,负线性相关)
② 表示两个变量的相关性程度
协方差的缺点:
![4c03ad52abd808d355453f19ed7dad13.png](https://i-blog.csdnimg.cn/blog_migrate/93539d8a5b779786ce430754dd05ad28.jpeg)
从图中看中,两种情况的协方差差别很大,是因为x1的变化幅度不同。
所以协方差的缺点:结果易受变量的变化幅度影响
所以为了能准确研究两个变量在变化过程中的相关程度,同时消除变量的变化幅度影响,就有了 相关系数
三、相关系数
相关系数是标准化后的协方差,相关系数消除了两个变量的变化幅度影响,而只是单纯反映两个变量每单位的相关性程度
![12888818dd8443fd1e6f4e1219b1a92c.png](https://i-blog.csdnimg.cn/blog_migrate/d3724073dce92fdeb007cd94d32803da.jpeg)
- 相关系数意义
(1)数值的正负表示两个变量的相关性方向(r>0 正相关; r<0 负相关; r=-1 完全负线性相关;r =1 完全正线性相关;r = 0 非线性相关 )
(2)数值的大小表示两个变量每单位的相关性程度
如何判断有相关关系?
![c59e4ab30041a77aa81145416845fb0c.png](https://i-blog.csdnimg.cn/blog_migrate/0123aa57b8fe6413b6cbc3f40087f642.jpeg)
判断相关系数的大小,并没有统一的规定,一般按三部分分类
① 0~0.3 或 : -0.3~0: 弱相关
② 0.3~0.6 或 -0.6~-0.3: 中度相关
③ 0.6~1 或 -1 ~ -0.6:高度相关
四、简单线性回归
- 最佳拟合线:
![8190d11266dda887026f09a7ce775e6e.png](https://i-blog.csdnimg.cn/blog_migrate/4808b5e962e31a739f2bc9ca7ce345ce.jpeg)
- 如何求a和b?
![a0ea1c3f48355cf928c68b8da3d76a56.png](https://i-blog.csdnimg.cn/blog_migrate/30ca505e95cf4fc579f7429b00b1154e.jpeg)
这样所求出的a,b 就能构成最佳拟合线
- 简单线性回归-python实现
建立数据集:
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]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)
#查看数据集前5行
examDf.head()
提取特征和标签:
#特征features
exam_X=examDf.loc[:,'学习时间']
#标签labes
exam_y=examDf.loc[:,'分数']
建立训练数据和测试数据 (训练80%,测试20%):
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)
建立模型:
'''
运行后会报错,因为这里输入的特征只有1个。注意看报错信息,通过这个例子也学会如何分析报错信息
'''
#第1步:导入线性回归
from sklearn.linear_model import LinearRegression
# 第2步:创建模型:线性回归
model = LinearRegression()
#第3步:训练模型
model.fit(X_train , y_train)
出现报错信息(因为我们输入的 特征只有 1列):
ValueError: Expected 2D array, got 1D array instead:
array=[4. 0.5 1.75 1.5 2.75 4.25 3. 2.5 4.5 1.25 3.25 4.75 5.5 0.75 1.75 5. ].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
reshape(-1,1): 根据所给的列数,自动按照原始数组的大小形成一个新的数组.
reshape(1, -1): 根据所给的行数,自动按照原始数组的大小形成一个新的数组.
使用reshape转换数组:
#将训练数据特征转换成二维数组XX行*1列
X_train=X_train.reshape(-1,1)
#将测试数据特征转换成二维数组行数*1列
X_test=X_test.reshape(-1,1)
#第1步:导入线性回归
from sklearn.linear_model import LinearRegression
# 第2步:创建模型:线性回归
model = LinearRegression()
#第3步:训练模型
model.fit(X_train , y_train)
最佳拟合线:
'''
最佳拟合线:y= + x
截距intercept:a
回归系数:b
'''
#截距
a=model.intercept_
#回归系数
b=model.coef_
print('最佳拟合线: 截距 a =',a,'回归系数 b =',b)
最佳拟合线: 截距 a = 7.67307692307692 回归系数 b = [16.02618658]
绘图:
#绘图
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()
![f05d846bc58d730c4ff68dbceeb02c24.png](https://i-blog.csdnimg.cn/blog_migrate/4121b473610ce1900510b58371f4c093.png)
五、线性评估模型准确度
![b3eb9f267e43db0847fd10bcc268903a.png](https://i-blog.csdnimg.cn/blog_migrate/723d4f1ee64ecab65cf8a15434ba98d9.jpeg)
如图,图2中的数据点比图1的多。误差平方和会因为数据点的多少,而影响评价的结果。
所以引入:决定系数R平方
R平方与训练点的数量无关,比误差平方和更可靠
- 决定系数R平方
![504b74d86e822f215bd22c5a05f7d90c.png](https://i-blog.csdnimg.cn/blog_migrate/e6f6364bbd5f973f61f2ff48467a2d01.jpeg)
![3c0e64abc7db71d866e796fcb8748736.png](https://i-blog.csdnimg.cn/blog_migrate/f264db285e5ee5aaada734558957e39e.jpeg)
决定系数R平方的意义:
(1)表示回归线的拟合程度:有多少百分比的y波动可以由回归线来描述(x的波动变化)
(2)R平方的取值在0~1之间,R平方越高,回归模型越精确。
- 决定系数R平方-python实现
#线性回归的scroe方法得到的是决定系数R平方
#评估模型:决定系数R平方
r2 = model.score(X_test , y_test)
'''score内部会对第一个参数X_test用拟合曲线自动计算出y预测值,内容是决定系数R平方的计算过程。所以我们只用根据他的要求输入参数即可。
'''
绘图:
#导入绘图包
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()
![ebdf46b5dd37d4343c0c182d5df18b23.png](https://i-blog.csdnimg.cn/blog_migrate/7b945edb0593d2d5e462b3755f99523c.png)
六、相关关系与因果关系
① 相关关系 ≠ 因果关系。因果关系是A的发生会导致B,B的发生是因为A(比如吃太多 和肥胖)。而相关关系存在第3方因素或纯属巧合(比如学校和孩子的成功有相关关系,学校越好,孩子越成功。经过研究,并没有因果关系。和孩子成功有因果关系的是 家庭原因。这里的第3方因素,就是家庭)。
② 如何判断是相关关系 还是因果关系?可以通过 单变量控制,来判断是相关关系 或 因果关系(比如控制其他因素不变,只变化一个因素,来看这个因素 是不是真的影响了结果)。
③ 什么时候需要相关关系,什么时候需要因果关系?在大部分的时候,是没法找到因果关系,所以有些问题直接应用相关关系就可以。但有些问题需要找到事件背后的原因,就需要采用因果关系。