一、前言
机器学习--特征与标签 : 输入模型的属性是“特征”,输出的是“标签”
机器学习的核心是“使用算法解析数据,从中学习,然后对世界上的某件事情做出决定或预测”。
这意味着,与其显式地编写程序来执行某些任务,不如教计算机如何开发一个算法来完成任务。有三种主要类型的机器学习:监督学习、非监督学习和强化学习,所有这些都有其特定的优点和缺点。监督学习涉及一组标记数据。计算机可以使用特定的模式来识别每种标记类型的新样本。监督学习的两种主要类型是分类和回归。在分类中,机器被训练成将一个组划分为特定的类。分类的一个简单例子是电子邮件帐户上的垃圾邮件过滤器。过滤器分析你以前标记为垃圾邮件的电子邮件,并将它们与新邮件进行比较。如果它们匹配一定的百分比,这些新邮件将被标记为垃圾邮件并发送到适当的文件夹。那些比较不相似的电子邮件被归类为正常邮件并发送到你的邮箱。
第二种监督学习是回归。在回归中,机器使用先前的(标记的)数据来预测未来。天气应用是回归的好例子。使用气象事件的历史数据(即平均气温、湿度和降水量),你的手机天气应用程序可以查看当前天气,并在未来的时间内对天气进行预测。
在无监督学习中,数据是无标签的。由于大多数真实世界的数据都没有标签,这些算法特别有用。无监督学习分为聚类和降维。聚类用于根据属性和行为对象进行分组。这与分类不同,因为这些组不是你提供的。聚类的一个例子是将一个组划分成不同的子组(例如,基于年龄和婚姻状况),然后应用到有针对性的营销方案中。降维通过找到共同点来减少数据集的变量。大多数大数据可视化使用降维来识别趋势和规则。
最后,强化学习使用机器的个人历史和经验来做出决定。强化学习的经典应用是玩游戏。与监督和非监督学习不同,强化学习不涉及提供“正确的”答案或输出。相反,它只关注性能。这反映了人类是如何根据积极和消极的结果学习的。很快就学会了不要重复这一动作。同样的道理,一台下棋的电脑可以学会不把它的国王移到对手的棋子可以进入的空间。然后,国际象棋的这一基本教训就可以被扩展和推断出来,直到机器能够打(并最终击败)人类顶级玩家为止。
机器学习是人工智能的一个分支。机器学习使用特定的算法和编程方法来实现人工智能。人工智能致力于创造出比人类更能完成复杂任务的机器。这些任务通常涉及判断、策略和认知推理,这些技能最初被认为是机器的“禁区”。虽然这听起来很简单,但这些技能的范围非常大——语言处理、图像识别、规划等等。
人工神经网络算法基于生物神经网络的结构,深度学习采用神经网络模型并对其进行更新。它们是大、且极其复杂的神经网络,使用少量的标记数据和更多的未标记数据。神经网络和深度学习有许多输入,它们经过几个隐藏层后才产生一个或多个输出。这些连接形成一个特定的循环,模仿人脑处理信息和建立逻辑连接的方式。此外,随着算法的运行,隐藏层往往变得更小、更细微。
深度学习是机器学习的一个子集,专注于模仿人类大脑的生物学和过程。目的是模仿人脑的思维过程,经常用于图像和语音识别。
(以上内容,了解即可)
二、机器学习步骤
(一)提出问题
一切机器学习的目标都是为了解决生活中的实际问题,只有明确要研究的问题才能提供方向。
(二)理解数据
这包括三方面:
采集数据:根据相关内容采集数据;
导入数据:我们拿到的数据可能在Excel、网络、或者数据库中,需将这些数据导入到Python数据结构中,如读取数据到数据框中;
查看数据集信息:如描述统计信息,从整体上了解数据。
(三)数据清洗
即数据预处理,从数据集中提取想要的特征信息。
(四)构建模型
用 训练数据来构建模型,即将上一步提取的数据特征放入机器学习算法中来构建模型。
(五)评估模型
用 测试数据 来评估模型的准确性,看模型预测效果如何。
(六)方案实施
将分析结果用分析报告进行汇报,若为kaggle项目,要将预测结果放到kaggle中即看到排名
三、Python机器学习包(sklearn)
Python中有一个专门的机器学习包---scikit-learn,简称sklearn,没有安装的可以在终端 conda install scikit-learn 安装这个机器学习包。安装机器学习包
四、相关性分析
备注:鉴于相关性分析的理论知识,在《深入浅出统计学》的第十五章 线性与回归 中讲得很简洁易懂,以下摘抄部分!
(一)概念浅析
单变量数据考虑的是一个单一变量的频数或概率。例如:单变量数据可以描述赌场收益。
单变量数据无法显示多组数据之间的关系。如果需要了解不同变量之间的关系,需用另一种类型的数据——二变量数据。
对于每一个观察结果,二变量数据给出两个变量数值。如果其中一个变量以某种方式受到控制,或者被用来解释另一变量,则这个变量被称为自变量或解释变量,另一个变量则被称为因变量或者反应变量。
绘制二变量数据图形,以x轴描述一个变量,以y轴描述另一个相应变量。借助这种图可以体现两个变量之间的关系。这种图叫做散点图或散布图。
#导入collections中的OrderedDict函数
from collections import OrderedDict
import pandas as pd
import matplotlib.pyplot as plt
#数据集
examDict={'学习时间':[0.5,0.75,1.00,1.25,1.5,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.5,4.00,4.25,4.5,4.75,5.00,5.5],
'分数':[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)
# 设置成微软雅黑,支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 1.创建画布
plt.figure(figsize=(20,8),dpi=80)
plt.xlabel('学习时间')
plt.ylabel('分数')
plt.title('学习时间和分数之间的关系')
# 2.绘制图像
plt.scatter(examDf['学习时间'],examDf['分数'])
# 3.显示图像
plt.show()散点图案例代码散点图效果
上图中,通过复习时间来预测成绩,所以,“学习时间”是数据的特征(也称自变量或解释变量);“分数”是数据的标签(也称因变量);
散点图的作用在于能体现数据的实际模式,通过散点图,可以愈发清晰的勾勒出两个变量之间的关系。数据散点图显示出一种独特的模式——数据点呈现直线分布,我们将这种现象称为相关。散点图显示出数据对之间的相关性。
相关性即变量之间的数据关系,通过散点图上的点的独特构成模式,可以识别出散点图上的各种相关性。如果散点图上的点几乎呈现直线分布,则相关性为线性。相关性的几种类型 - 15章
注意:相关性度量的是线性关系,但并不是所有关系都是线性的。
(二)最佳拟合线
如何用散点图进行预测呢?用最佳拟合线预测数值。
最佳拟合线,即,在散点图上画一条穿过这些点的直线,使这些直线尽量接近各个点。你无法令这条直线穿过每一个点,不过,若存在线性相关性,则应该可以保证每一个点合理地接近你所绘制的直线。能更好地接近所有数据点的线被称为最佳拟合线。
但是,用这种方法画出的线只是一种最佳猜测。用上述方法绘制图线的问题在于:这只是一个估计,因此根据这条线做出的任何预测值都值得怀疑。你没有什么精确的方法量度这条线是否是最佳匹配线。这条线具有主观性,这条线的拟合质量取决于你的判断。因此,我们需要使用数学或统计方法找出最佳拟合线,将误差最小化。
误差平方和:取各个数值y,减去最佳拟合线得出的y的预测值,求其平方,然后将所有平方数加起来。
y = ax + b中的b代表这条直线的斜率,或者陡度,即b是最佳拟合线的斜率。
我们用于求出最佳拟合线的数学方法称为最小二乘回归法。
最小二乘回归法是一种数学方法,可用一条最佳拟合线将一组二变量数据拟合,通过公式为y=ax+b的一条直线与一组数值相拟合,使得误差平方和最小——即,使得实际数值与这些数值的估计值之间的差值最小。
直线y=ax+b被称为回归线。
注:在预测一个特定x值对应的y值时,要避免对已知数据点范围以外的值进行预测。线性回归法只是根据手头拥有的信息进行估计的一种方法,它体现了已知了各个数据点之间的关系,这并不表示也适用于数据限值以外的范围。
(三)验证(相关系数)
直线 y=ax+b 是我们能够得出的最佳拟合线,但若以它为模型描述二变量之间的关系,需考虑:回归线的相关性强度。目的在于:根据已知条件得出的期望结果到底有多大的精确性。
1、概念
用相关系数,衡量直线与数据的拟合度。
相关系数是介于-1和1之间的一个数,描述了各个数据点与直线的偏离程度。通过它可以量度回归线与数据的拟合度,说明两个变量之间的相关性的强弱程度,通常用字母r表示。
2、相关系数r的 3种 极值情况:
r=-1,完全负线性相关。
r=0,不存在相关性,但是可能存在其他关系。
r=1,完全正线性相关。
3、用Python实现相关系数 (correlation)
使用 pandas 中数据框的 corr() 可以得到2个变量的相关性系数,并返回与数据框,数据框里面存放的是相关系数矩阵。
#导入collections中的OrderedDict函数
from collections import OrderedDict
import pandas as pd
#数据集
examDict={'学习时间':[0.5,0.75,1.00,1.25,1.5,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.5,4.00,4.25,4.5,4.75,5.00,5.5],
'分数':[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)
# 用 pandas实现相关系数
rDf = examDf.corr()
print(rDf)
上图中“学习时间”和“分数”之间的相关系数为0.92,说明两者有很强的相关性,1指的是变量与自身的相关系数是1
之所以用相关系数矩阵来表示相关系数,是因为一个可以通过矩阵里面的数直接找到对应拿两个变量之间的关系。
五、实战案例:用Python实现简单线性回归(linear regression--线性回归)
(一)将数据拆分成 训练数据 和 测试数据
提取特征和标签后,因为需要保留一部分测试数据来验证模型的好坏,所以的通过 train_test_split 函数,按要求比例(80%和20%)随机地分割出:训练数据和测试数据(按规则命名区分出:特征和标签、训练数据和测试数据)
#导入collections中的OrderedDict函数
from collections import OrderedDict
import pandas as pd
import matplotlib.pyplot as plt
#数据集
examDict={'学习时间':[0.5,0.75,1.00,1.25,1.5,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.5,4.00,4.25,4.5,4.75,5.00,5.5],
'分数':[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)
# 一、将数据拆分成训练数据和测试数据
# 1.1、提取特征和标签
# 特征 features
exam_x = examDf.loc[:,'学习时间']
# 标签 labels
exam_y = examDf.loc[:,'分数']
# print(exam_x,exam_y)
# 1.2、导入机器学习中的函数train_test_split
from sklearn.model_selection import train_test_split
# 1.3、建立训练数据和测试数据
X_train,X_test,Y_train,Y_test = train_test_split(exam_x,exam_y,train_size=0.8)
# 输出数据大小
print('原始数据特征:',exam_x.shape,'训练数据特征:',X_train.shape,'测试数据特征:',X_test.shape)
print('原始数据特征:',exam_y.shape,'训练数据特征:',Y_train.shape,'测试数据特征:',Y_test.shape)
# 用散点图查看数据拆分的结果
# 设置成微软雅黑,支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 1.创建画布
plt.figure(figsize=(20,8),dpi=80)
plt.xlabel('学习时间')
plt.ylabel('分数')
plt.title('学习时间和分数之间的关系')
# 2.绘制图像
plt.scatter(X_train,Y_train,color='b',label='训练数据')
plt.scatter(X_test,Y_test,color='r',label='测试数据')
# 显示图例
# plt.legend(loc='upper left')
plt.legend(loc=2)
# 3.显示图像
plt.show()
X_train 为训练数据标签,X_test 为测试数据标签
Y_train 为训练数据特征,Y_test 为测试数据特征
exam_x 为原始数据特征,exam_y 为原始数据标签
train_size=0.8表示训练数据占数据集的80%
用散点图查看数据拆分的结果:
# 用散点图查看数据拆分的结果
# 设置成微软雅黑,支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 1.创建画布
plt.figure(figsize=(20,8),dpi=80)
plt.xlabel('学习时间')
plt.ylabel('分数')
plt.title('学习时间和分数之间的关系')
# 2.绘制图像
plt.scatter(X_train,Y_train,color='b',label='训练数据')
plt.scatter(X_test,Y_test,color='r',label='测试数据')
# 显示图例
# plt.legend(loc='upper left')
plt.legend(loc=2)
# 3.显示图像
plt.show()训练数据 和 测试数据 拆分效果图
(二)建立训练模型
# 二、建立训练模型
# 导入线性回归函数
from sklearn.linear_model import LinearRegression
# 创建线性回归模型
model = LinearRegression()
'''
sklearn 要求输入的特征为:二维数组类型,目前只有一个特征,要用 reshape 转换成二维数组类型。
reshape(-1,1)就是改变成1列的数组,这个数组的长度是根据原始数组的大小来自动形成的。
'''
X_train = X_train.values.reshape(-1,1)
X_test = X_test.values.reshape(-1,1)
# 使用训练数据训练模型
model.fit(X_train,Y_train)
# print(model.fit(X_train,Y_train))
(三)最佳拟合线
# 三、求出最佳拟合线,即回归方程:y=a+bx
# 截距a
a = model.intercept_
# 回归系数
b = model.coef_
a = float(a)
b = float(b)
print('最佳拟合线:''y={}+{}x'.format(a,b))
# 最佳拟合线:y=5.094858427885114+17.314525196769903
# 画出最佳拟合线
# 设置成微软雅黑,支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建画布
plt.figure(figsize=(20,8),dpi=80)
plt.xlabel('学习时间')
plt.ylabel('分数')
plt.title('学习时间和分数之间的关系')
plt.scatter(X_train,Y_train,color='b',label='训练数据')
# 训练数据预测值
Y_train_pred = model.predict(X_train)
# 绘制最佳拟合线
plt.plot(X_train,Y_train_pred,color='r',linewidth=3,label='最佳拟合线')
# 显示图例
# plt.legend(loc='upper left')
plt.legend(loc=2)
# 显示图像
plt.show()
线性回归法是根据手头拥有的信息进行估计的一种方法,它体现了已知的各个数据点之间的关系,但不表示它也适用于数据限值以外的范围。
但是,到目前为止,从样本中随机分割出来20%的 X_test 和 Y_test,怎么用呢?莫急,淡定,淡定,继续往下看!
(四)评估模型精度
1、y的误差平方和SSE =
误差平方和会因为数据点的多少而影响评价的结果;且只能显示出总波动中有多少没有被回归线所描述。
y的总波动 =
误差平方和 / 总波动 = 有多少百分比的y波动没有被回归线描述
2、决定系数
的优点:与训练点的数量无关,不受数据集中的数量的多少的影响,比误差平方和SSE更可靠。
决定系数
= 1 - (误差平方和 / 总波动) :表示 有多少百分比的y波动被回归线描述
决定系数
功能1:回归线的拟合程度,回归线的精度;
决定系数
功能2:取值范围在0和1之间,用数值大小来描述,R平方越高,回归模型越精确。0:无法从x值预测出y值;1:可以从x值预测出y值,没有误差;
3、决定系数
-Python实现(score()方法)
# 四、评估模型精度
# 用python实现决定系数R平方
R2 = model.score(X_test,Y_test)
print('决定系数R的平方为:',R2)
在训练数据样本只有16条的情况下,决定系数 R平方 达到83%,很接近1,说明训练模型的准确性还不错。
(五)案例分析用的完整代码
搭建好数据分析所需环境后,即可复制完整代码跑一跑。我个人用的是 pycharm 编辑器。
#导入collections中的OrderedDict函数
from collections import OrderedDict
import pandas as pd
import matplotlib.pyplot as plt
#数据集
examDict={'学习时间':[0.5,0.75,1.00,1.25,1.5,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.5,4.00,4.25,4.5,4.75,5.00,5.5],
'分数':[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)
# 一、将数据拆分成训练数据和测试数据
# 1.1、提取特征和标签
# 特征 features
exam_x = examDf.loc[:,'学习时间']
# 标签 labels
exam_y = examDf.loc[:,'分数']
# print(exam_x,exam_y)
# 1.2、导入机器学习中的函数train_test_split
from sklearn.model_selection import train_test_split
# 1.3、建立训练数据和测试数据
X_train,X_test,Y_train,Y_test = train_test_split(exam_x,exam_y,train_size=0.8)
# 输出数据大小
print('原始数据特征:',exam_x.shape,'训练数据特征:',X_train.shape,'测试数据特征:',X_test.shape)
print('原始数据特征:',exam_y.shape,'训练数据特征:',Y_train.shape,'测试数据特征:',Y_test.shape)
# 二、建立训练模型
# 导入线性回归函数
from sklearn.linear_model import LinearRegression
# 创建线性回归模型
model = LinearRegression()
'''
sklearn 要求输入的特征为:二维数组类型,目前只有一个特征,要用 reshape 转换成二维数组类型。
reshape(-1,1)就是改变成1列的数组,这个数组的长度是根据原始数组的大小来自动形成的。
'''
X_train = X_train.values.reshape(-1,1)
X_test = X_test.values.reshape(-1,1)
# 使用训练数据训练模型
model.fit(X_train,Y_train)
# print(model.fit(X_train,Y_train))
# 三、求出最佳拟合线,即回归方程:y=a+bx
# 截距a
a = model.intercept_
# 回归系数
b = model.coef_
a = float(a)
b = float(b)
print('最佳拟合线:''y={}+{}x'.format(a,b))
# 画出最佳拟合线
# 设置成微软雅黑,支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建画布
plt.figure(figsize=(20,8),dpi=80)
plt.xlabel('学习时间')
plt.ylabel('分数')
plt.title('学习时间和分数之间的关系')
plt.scatter(X_train,Y_train,color='b',label='训练数据')
# 训练数据预测值
Y_train_pred = model.predict(X_train)
# 绘制最佳拟合线
plt.plot(X_train,Y_train_pred,color='r',linewidth=3,label='最佳拟合线')
# 显示图例
# plt.legend(loc='upper left')
plt.legend(loc=2)
# 显示图像
plt.show()
# 四、评估模型精度
# 用python实现决定系数R平方
R2 = model.score(X_test,Y_test)
print('决定系数R的平方为:',R2)
# 图形展示
# 创建画布
plt.figure(figsize=(20,8),dpi=80)
plt.xlabel('学习时间')
plt.ylabel('分数')
plt.title('学习时间和分数之间的关系')
plt.scatter(X_train,Y_train,color='b',label='训练数据')
plt.scatter(X_test,Y_test,color='orange',label='测试数据')
# 训练数据预测值
Y_train_pred = model.predict(X_train)
# 绘制最佳拟合线
plt.plot(X_train,Y_train_pred,color='r',linewidth=3,label='最佳拟合线')
# 显示图例
# plt.legend(loc='upper left')
plt.legend(loc=2)
# 显示图像
plt.show()
六、相关关系与因果关系
存在相关关系是否意味着一个变量会影响另一个变量?
其实,两个变量之间存在相关关系并不一定意味着一个变量会影响另一个变量,也不意味着二者存在二者实际关系。
两者变量之间的相关关系意味着二者之间存在某种数学关系,即,当我们在图上绘制数值时,我们能够看出某种模式,并能够预测出没有出现在图上的数值。我们并不知道两个变量之间是否存在实际关系,当然,我们也不知道一个变量是否会影响另一个变量,或是否有其他因素在发挥作用。
因果关系:A的发生必然会导致B,B的发生必须以A的发生为前提。
相关关系:仅仅可能是A和B同时发生,并不意味着A会影响B或B会影响A,A与B不一定存在实际的关系。
事情的发生往往是一个复杂系统,是由多因素共同作用造成的,凡事都应该避免运用单因素模型去解释。
相关关系的运用:一般要通过研究来发现相关关系,再进一步找原因看这些变量是否存在因果关系。
所以,相关不一定因果,但是因果一定相关,数据分析做预测的目的是求出相关,然后寻找因果。
举个例子:假设你收集了一些数据并发现,随着时间的推移。某个小镇上的咖啡店的数目增多了。同时唱片店的数目减小了。这可能的确是实情,但我们不能说咖啡店数目和唱片店数目之间有什么实在的关系,即,我们不能说咖啡店数目的增加导致了唱片店数目的减小。我们只能说:在咖啡店数目的增加的同时,唱片店的数目减少了。
七、机器学习-相关性分析小结相关性分析知识要点