分类(Classification)与回归(Regression)都属于监督学习,他们的区别在于:
分类:用于预测有限的离散值,如是否得了癌症(0,1),或手写数字的判断,是0,1,2,3,4,5,6,7,8还是9等。分类中,预测的可能的结果是有限的,且提前给定的。
回归:用于预测实数值,如给定了房子的面积,地段,和房间数,预测房子的价格。
LinearRegression 拟合一个带有系数 w = (w1, …, wp) 的线性模型,使得数据集实际观测数据和预测数据(估计值)之间的残差平方和最小。
其数学表达式为:
-
进行预测前查看一下数据集
https://scikit-learn.org/stable/datasets/index.html#diabetes-dataset
diabetes数据集,这是一个糖尿病的数据集,主要包括442行数据,10个属性值,分别是:Age(年龄)、性别(Sex)、Body mass index(体质指数)、Average Blood Pressure(平均血压)、S1~S6一年后疾病级数指标。Target为一年后患疾病的定量指标。 -
进行预测
fit(x, y): 训练。分析模型参数,填充数据集。其中x为特征,y位标记或类属性。predict(): 预测。它通过fit()算出的模型参数构成的模型,对解释变量进行预测其类属性。预测方法将返回预测值y_pred。
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model # 从sklearn中导入数据 diabetes = datasets.load_diabetes() # 选择其中一种属性,按照二维数组输出 diabetes_x = diabetes.data[:, np.newaxis, 2] # 将数据分成训练集和测试集 # 测试集为后20行,其他的为训练集 diabetes_x_train = diabetes_x[:-20] diabetes_x_test = diabetes_x[-20:] # 将定量指标分为训练集和测试集 diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] # 通过fit(x,y)方法训练模型 regr = linear_model.LinearRegression() regr.fit(diabetes_x_train, diabetes_y_train) # 线性系数w print("coefficient = %f\n" % float(regr.coef_)) # 残差平方和 print("Residual sum of squares: %.2f" % np.mean((regr.predict(diabetes_x_test) - diabetes_y_test) ** 2)) # 确定系数:1为完美预测 print("Coefficient of determination: %.2f" % regr.score(diabetes_x_test, diabetes_y_test)) # u代表Unicode编码,增加fontproperties属性可直接显示中文 # eg:plt.title(u"例子", fontproperties="SimHei") plt.title(u"LinearRegression Diabetes") plt.xlabel(u"Attributes") plt.ylabel(u"Measure of disease") # 点的准确位置 plt.scatter(diabetes_x_test, diabetes_y_test, color="red") # 预测结果 plt.plot(diabetes_x_test, regr.predict(diabetes_x_test), color="blue") plt.show()
输出结果:
coefficient = 938.237861 Residual sum of squares: 2548.07 Coefficient of determination: 0.47
-
模型优化,增加了斜率、 截距的计算,同时增加了点图到线性方程的距离,保存图片设置像素。
from sklearn import datasets import numpy as np from sklearn import linear_model import matplotlib.pyplot as plt # 从sklearn中导入数据 diabetes = datasets.load_diabetes() diabetes_x = diabetes.data[:, np.newaxis, 2] diabetes_x_train = diabetes_x[:-20] diabetes_x_test = diabetes_x[-20:] diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] # 通过fit(x,y)方法训练模型 regr = linear_model.LinearRegression() regr.fit(diabetes_x_train, diabetes_y_train) # 查看预测结果和真实结果 diabetes_x_pre = regr.predict(diabetes_x_test) print('预测结果') print(diabetes_x_pre) print('真实结果') print(diabetes_y_test) print('线性系数w:', regr.coef_) # 确定系数:1为完美预测 print('确定系数:', regr.score(diabetes_x_test, diabetes_y_test)) plt.title(u"LinearRegression Diabetes") plt.xlabel(u"Attributes") plt.ylabel(u"Measure of disease") # 点的准确位置 # k, g, r为color # .是点型参数(markers) plt.plot(diabetes_x_test, diabetes_y_test, 'k.') # 预测结果 plt.plot(diabetes_x_test, diabetes_x_pre, 'g') # 真实结果到预测结果的距离 for idx, m in enumerate(diabetes_x_test): plt.plot([m, m], [diabetes_y_test[idx], diabetes_x_pre[idx]], 'r-') # 保存图片,设置像素 plt.savefig('Diabetes.png', dpi=300) plt.show()
输出结果:
预测结果 [225.9732401 115.74763374 163.27610621 114.73638965 120.80385422 158.21988574 236.08568105 121.81509832 99.56772822 123.83758651 204.73711411 96.53399594 154.17490936 130.91629517 83.3878227 171.36605897 137.99500384 137.99500384 189.56845268 84.3990668 ] 真实结果 [233. 91. 111. 152. 120. 67. 310. 94. 183. 66. 173. 72. 49. 64. 48. 178. 104. 132. 220. 57.] 线性系数w: [938.23786125] 确定系数: 0.47257544798227136