线性回归
线性回归是监督学习中的一种方法,这次讲LinearRegression线性回归.
LinearRegression,顾名思义,是一种回归的方法.LinearRegression内部使用的是最小二乘法.
下面我们使用LinearRegression来预测糖尿病人的疾病情况.
基本步骤:
-
引入相关包
from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split
-
加载数据集
sklearn加载数据集十分方便,datasets.loadxxx即可,本例中加载的是diabetes糖尿病病人的数据.
# 加载数据集 diabetes = datasets.load_diabetes()
经过上一步代码我们已经成功加载了数据集,但对数据不了解怎么办?我们加载的数据到底是什么样子的呢?可以使用以下代码查看数据信息:
print(diabetes.DESCR)
DESCR属性中存放着数据集的一些基本信息,可以打印出来查看,该数据集的信息为:
**Data Set Characteristics:** :Number of Instances: 442 :Number of Attributes: First 10 columns are numeric predictive values :Target: Column 11 is a quantitative measure of disease progression one year after baseline :Attribute Information: - Age - Sex - Body mass index - Average blood pressure - S1 - S2 - S3 - S4 - S5 - S6 Note: Each of these 10 feature variables have been mean centered and scaled by the standard deviation times `n_samples` (i.e. the sum of squares of each column totals 1).
可以很直观看到共有442行数据, 共有10个特征,并且每个特征代表的含义是什么都可以看到.
有兴趣的话可以查看具体数据信息:数据信息
-
数据预处理
-
该数据集有10个特征,为了方便,在这里我们只选择一个特征进行研究.
x = diabetes.data[:, np.newaxis, 2] # 选出1个特征 (442, 1) y = diabetes.target # 获得目标数据值
diabetes.data 可以获得原始数据,类似二维数组(442, 10),共有442组数据,每组数据有10个特征
diabetes.target 可以获每组数据对应的目标值. -
对数据进行划分,分成训练集和测试集.将数据分成训练集和测试集可以有助于减小误差.在同样的数据上预测和测试是错误的行为.
# 将数据划分为训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)
-
-
模型训练和预测
# 创建线性回归模型 clf = LinearRegression() # 用训练好的模型在测试集上预测 y_pred = clf.predict(x_test)
如果想使用别的模型来训练,只需修改成相应模型即可
-
模型评价
# 打印模型的得分,进行模型评价 print(clf.score(x_test, y_test))
clf.score默认使用的是R2评分标准,评分在0-1之间,越大模型拟合越好
结果: 0.3172099449537781 是一个很低的分数,说明该模型的拟合程度不是很好,结果可以通过图片直观反映出来.
原因: 该数据共有10个特征,我们只选择了一组特征进行拟合训练,所以模型的效果不是很好也是情理之中的.
-
绘图
# 绘图 plt.scatter(x_test, y_test, color='black') # 绘制散点图 plt.plot(x_test, y_pred, color='blue', linewidth=3) # 绘制直线 plt.xticks(()) # 去除横坐标 plt.yticks(()) # 去除纵坐标 plt.show() # 显示图片
绘该步骤中,绘制图片的步骤也是十分有规律的:
首先,绘制散点图为: plt.scatter 本例中散点代表着原本的数据
其次,绘制直线图为: plt.plot 本例中直线代表着预测的值可以明显看出差异较大,拟合效果不是很好
以下是全部代码
# 线性回归
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 加载数据集
diabetes = datasets.load_diabetes()
print(diabetes.DESCR) # 打印出该数据集的基本信息
x = diabetes.data[:, np.newaxis, 2] # 选出1个特征 (442, 1)
y = diabetes.target # 目标数据值
# 将数据划分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)
# 创建线性回归模型
clf = LinearRegression()
# 训练模型
clf.fit(x_train, y_train)
# 用训练好的模型在测试集上预测
y_pred = clf.predict(x_test)
# 打印模型的得分,进行模型评价
print(clf.score(x_test, y_test))
# 绘图
plt.scatter(x_test, y_test, color='black')
plt.plot(x_test, y_pred, color='blue', linewidth=3)
plt.xticks(()) # 去除横坐标
plt.yticks(()) # 去除纵坐标
plt.show() # 显示图片
引用:
原例子出自:, sklearn官方文档,作者在修改了其中一部分内容.