线性回归
本示例仅使用糖尿病数据集的一个特征,以此来阐述二维图中的线性回归。 可以在图中看到预测的回归直线,显示了线性回归如何尝试绘制一条直线,该直线将最大程度地减少数据集中观察到的响应与通过线性近似预测的响应之间的残差平方和。不仅如此,本例还计算了系数,残差平方和和决定系数。
数据集介绍
本次案例采用sklearn中的diabetes数据集, diabetes是一个关于糖尿病的数据集,包括442个病人的生理数据及一年后的病情发展状况。
diabetes数据集中包含442个样本,每个样本包含10个特征,分别是:
(年龄,性别,体质指数,血压,s1,s2,s3,s4,s5,s6)
s1~s6分别是6种血清化验数据。
想了解更多关于diabetes数据集可以去 diabetes了解更多
现在可以上代码了:
# @Author: coderdz
# @Site: github.com/dingzhen7186
# @Time: 2020.09.22
# @Description: Linear Regression Example
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
# return_X_y=True表示不再返回Bunch对象,而是返回其data和target的ndarray对象
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y = True)
# (442, 10) , (442, ), diabetes_X含有10个特征
# 只使用一个特征
# 使用np.newaxis将第三号特征选择后并多加了一个维度
diabetes_X = diabetes_X[:, np.newaxis, 2] # (442, 1)
# 数据集划分为训练集和测试集
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
# 把预测的目标划分为训练集和测试集
diabetes_y_train = diabetes_y[:-20]
diabetes_y_test = diabetes_y[-20:]
# 创建线性回归对象
regr = linear_model.LinearRegression()
# 用测试集训练模型
regr.fit(diabetes_X_train, diabetes_y_train)
# 使用测试集进行预测
diabetes_y_pred = regr.predict(diabetes_X_test) # type:ndarray
# 系数的值
print('Coefficients: \n', regr.coef_)
# 均方误差
print('Mean squared error: %.2f' % mean_squared_error(diabetes_y_test, diabetes_y_pred))
# r2决定系数: 1是完美预测,模型效果越好越接近1,效果越差越接近0
print('Coefficient of determinatino: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))
# 画图展示
plt.scatter(diabetes_X_test, diabetes_y_test, color = 'black')
plt.plot(diabetes_X_test, diabetes_y_pred, color = 'blue', linewidth = 3)
plt.xticks(())
plt.yticks(())
plt.show()
输出如下:
Coefficients:
[938.23786125]
Mean squared error: 2548.07
Coefficient of determinatino: 0.47
sklearn模型评估损失误差
-
sklearn.metrics.mean_squared_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average', squared=True)
均方误差回归损失函数,通过传递预测值和真实值来评估误差,返回一个float型数值或者 ndarray,误差越小模型训练效果越好,最好是0.0
squared
: 如果为True,返回均方误差MSE值;如果为False,返回均方根误差RMSE值。
multioutput
: 默认为’uniform_average’,表示计算所有元素均方误差,返回一个标量。'raw_values’表示返回完整的误差集合。示例:
>>> from sklearn.metrics import mean_squared_error >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_squared_error(y_true, y_pred) 0.375 >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_squared_error(y_true, y_pred, squared=False) 0.612... >>> y_true = [[0.5, 1],[-1, 1],[7, -6]] >>> y_pred = [[0, 2],[-1, 2],[8, -5]] >>> mean_squared_error(y_true, y_pred) 0.708... >>> mean_squared_error(y_true, y_pred, squared=False) 0.822... >>> mean_squared_error(y_true, y_pred, multioutput='raw_values') array([0.41666667, 1. ]) >>> mean_squared_error(y_true, y_pred, multioutput=[0.3, 0.7]) 0.825...
-
sklearn.metrics.r2_score(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average')
r2决定系数: 1是完美预测,模型效果越好越接近1, 模型如果很差的话甚至可能是负数,返回一个float型数值或 ndarray
示例:
>>> from sklearn.metrics import r2_score >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> r2_score(y_true, y_pred) 0.948... >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> r2_score(y_true, y_pred, ... multioutput='variance_weighted') 0.938... >>> y_true = [1, 2, 3] >>> y_pred = [1, 2, 3] >>> r2_score(y_true, y_pred) 1.0 >>> y_true = [1, 2, 3] >>> y_pred = [2, 2, 2] >>> r2_score(y_true, y_pred) 0.0 >>> y_true = [1, 2, 3] >>> y_pred = [3, 2, 1] >>> r2_score(y_true, y_pred) -3.0
继续学习中,加油啊!