前言
机器学习指的是让计算机通过一定的算法,并结合概率学、统计学等知识来自动在数据中找到用户的需求分布或者行为规律。
就像音乐软件的每日歌曲推荐,里面大部分都满足用户的个人喜好。因为这些歌曲是软件通过分析用户平时喜欢的歌的特征建立的推荐模型,每天推荐不同的歌曲一样。
在机器学习里面【特征】就是数据的属性(流行歌曲/轻音乐/欧美/节奏/强度),用户的行为数据越多,喜好【特征】就越详细,这样建立的模型准确性就越高。
模型建好了接下来就是把歌曲推荐给用户,要注意不论什么模型它的准确率都不是百分百正确,用户对推荐歌曲的喜欢与否就是【标签】,用来评价机器学习准确性的好坏。
机器学习的步骤一般分为5步:
1.提出问题、2.理解数据、3.数据清洗、4.构建模型、5.评估
现在的机器学习用很多不同的算法,这里先从简单的线性回归讲起。
正文:
回归分析是研究数据自变量x和因变量y之间关系变化的一种分析方法,从已知的数据中找到它们的发展趋势、以此来预测未来的模型,就好比销售额跟推广费之间的相互关系。
简单的线性回归模型为:Y=a+bX
a是常数项,代表回归直线在纵坐标轴上的截距
b是回归系数,代表回归直线的斜率,b>0代表呈正相关性、b<0代表呈负相关性
一:简单线性回归
1.使用Python建立简单线性回归模型
1.1 引用模块,建立数据集
#需要用到的模块
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)
examDf.head()
1.2 计算相关系数
在这里‘学习时间’是数据的特征、‘分数’是数据的标签,把它们提取出来
#提取特征和标签
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")
plt.ylabel("Score")
#显示图像
plt.show()
这样就得到一个看起来呈现正相关分布的散点图
接着来判断‘学习时间’和‘成绩’的相关系数
#相关系数:corr返回结果是一个数据框,存放的是相关系数矩阵
rDf=examDf.corr()
print('相关系数矩阵:')
rDf
数字【0.92】就是它们的相关系数,非常高、说明学习时间越长成绩就越高
2 使用Python实现线性回归
2.1提取特征和标签
#特征features
exam_X=examDf.loc[:,'学习时间']
#标签labes
exam_y=examDf.loc[:,'分数']
2.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 = .8)
#输出数据大小
print('原始数据特征:',exam_X.shape ,
',训练数据特征:', X_train.shape ,
',测试数据特征:',X_test.shape )
print('原始数据标签:',exam_y.shape ,
',训练数据标签:', y_train.shape ,
',测试数据标签:' ,y_test.shape)
因为之前建立了20组数据,所以一共是20,为了更好地观察效果,我们用散点图的方式把它们呈现出来
#绘制散点图
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()
其中蓝色的点是训练数据、红色的点是测试数据
2.3 训练模型(是用训练数据)
注意,因为建立的数据的特征只有1种,这里需要改变它们的数组形状才能继续操作
#将训练数据特征转化为二维数组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=a+xb,截距intercept:a,回归系数:b
'''
#截距
a=model.intercept_
#回归系数
b=model.coef_
print('最佳拟合线:截距a=',a,',回归系数b=',b)
也就是说线性回归方程是:y=8.806+16.278b,我们通过图表来展示结果
#绘图
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()
3. 评估模型(使用测试数据)
#线性回归的scroe方法得到的是决定系数R平方
#R越接近1,代表越准确
model.score(X_test,Y_test)
R²为0.97,说明模型精确程度、越大代表越精确,接着我们把测试数据和训练数据放在一起用图表展示出来
#进行比较
#把训练数据(蓝色的点)和测试数据(红色的点)放在一起比较
import matplotlib.pyplot as plt
#绘制训练数据散点图
plt.scatter(X_train,Y_train,color='blue',label="train data")
#用训练数据绘制最佳线
Y_train_pred=model.predict(X_train)
#最佳拟合线:标签用的事训练数据的预测值Y_train_pred
plt.plot(X_train,Y_train_pred,color='black',linewidth=3,label="best line")
#绘制散点图
plt.scatter(X_test,Y_test,color='red',label="test data")
#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
回归模型如上图所示
二:逻辑回归
逻辑回归跟线性回归的区别在于,前者是用二分类(是/否)来建立模型的,也就是说结果标签只有‘真’/‘假’这两种情况,就像硬币的两面。用Python做逻辑回归模型
模块还是之前的模块,数据集也是之前的数据集,只是把‘成绩’修改成‘是否通过考试’,0代表未通过、1代表通过,不存在其他情况。
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],
'通过考试':[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)
examDf.head()
2.提取特征和标签,并绘制散点图
#t特征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")
plt.ylabel("Pass")
#显示图像
plt.show()
散点图如下所示
3.建立训练数据集和测试数据集
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('Pass')
#显示图像
plt.show()
4.训练模型
因为我们用的数据只有1个特征,这里先要转换它们的形状
#将训练数据特征转换成二维数组
X_train = X_train.values.reshape(-1,1)
#将测试数据特征转换成二维数组
X_test = X_test.values.reshape(-1,1)
#导入逻辑回归包
from sklearn.linear_model import LogisticRegression
#创建模型:逻辑回归
model = LogisticRegression()
#训练模型
model.fit(X_train,y_train)
接着评估模型
#评估模型:准确率
model.score(X_test,y_test)
5.评估模型
'''
理解逻辑回归函数
斜率slope
截距intercept
'''
#第1步:获得回归方程的y值
#回归方程:y=a+b*x
#截距
a=model.intercept_
#回归系数
b=model.coef_
x=3
z=a+b*x
#第2步:将z值带入逻辑回归中,得到概率值
y_pred = 1/(1+np.exp(-z))
print('预测的概率值:',y_pred)
小结:
作为机器学习的第一步,代码虽然多、但理解并没那么困难,需要多加练习才能熟能生巧。