pip install scikit-learn
以Scikit-learn的内置数据集波士顿(Boston)房屋价格为案例,采用单变量线性回归算法对数据进行拟合与预测。
波士顿房屋的数据于1978年开始统计,共506个数据点,涵盖了波士顿不同郊区房屋的14中特征信息。
在这里,选取房屋价格(MEDV)、每个房屋的房间数量(RM)两个变量进行回归,其中房屋价格为目标变量,每个房屋的房间数量为特征变量。将数据导入进来,并进行初步分析。
1、预处理
先获取数据集,获取到MEDV和RM,然后看它们的规律。
2、划分数据集,训练集和测试集
import matplotlib.pyplot as plt #绘制图形库
import numpy as np #科学计算库
import pandas as pd #数据分析库
from sklearn.datasets import load_boston#从sklearn数据集中导入波士顿数据
boston=load_boston()
#print(boston.keys())
#print(boston.feature_names)
bos=pd.DataFrame(boston.data)#DataFrame是pandas的一个表格型数据结构,它含有一组有序的列,每列可以是不同的值类型
#print(bos[5].head(5))#返回数据第五列的前五行
bos_target=pd.DataFrame(boston.target)
#print(bos_target.head(5))
#绘制房屋价格MEDV 每个房屋平均客房数RM --散点图
dots1=bos[5]
#dots1=bos.iloc[:,5:6],iloc[ : , : ]
""" 前面的冒号就是取行数,后面的冒号是取列数
左闭右开原则 """
dots2=bos_target
plt.scatter(dots1,dots2)
plt.xlabel('RM')
plt.ylabel('MEDV')
plt.title('The relation of MEDV and RM')
plt.show()
from sklearn.model_selection import train_test_split
dots1=np.array(dots1.values)
dots2=np.array(dots2.values) #np.array,numpy
x_train,x_test,y_train,y_test=train_test_split(dots1,dots2,test_size=0.25) #把25%的数据作为测试集
print(x_train.shape,x_test.shape,y_train.shape,y_test.shape) #shape是形状,数组的行数和列数
from sklearn.linear_model import LinearRegression#导入库
lr=LinearRegression() #设定回归算法
lr.fit(x_train,y_train) #使用训练数据进行参数求解
print(lr.intercept_,lr.coef_) #截距和权重向量
#预测
y_hat=lr.predict(x_test)
#评估
#y_test与y_hat的可视化
plt.figure(figsize=(10,6)) #设置图片尺寸
t = np.arange(len(X_test)) #创建t变量
plt.plot(t, y_test, 'r', linewidth=2, label='y_test')
#绘制y_test曲线,参数分别是:横纵坐标数据,线颜色,宽度...
plt.plot(t, y_hat, 'g', linewidth=2, label='y_hat') #绘制y_hat曲线
plt.legend() #设置图例
plt.xlabel('test data')
plt.ylabel('price')
plt.show()
plt.figure(figsize=(10,6)) #绘制图片尺寸
plt.plot(y_test,y_hat,'o') #绘制散点
plt.plot([-10,60],[-10,60], color="red", linestyle="--", linewidth=1.5)
plt.axis([-10,60,-10,60])
plt.xlabel('ground truth') #设置X轴坐标轴标签
plt.ylabel('predicted') #设置y轴坐标轴标签
plt.grid() #绘制网格线
from sklearn import metrics
from sklearn.metrics import r2_score
# 拟合优度R2的输出方法一
print ("r2:",lr.score(X_test, y_test)) #基于Linear-Regression()的回归算法得分函数,来对预测集的拟合优度进行评价
# 拟合优度R2的输出方法二
print ("r2_score:",r2_score(y_test, y_hat)) #使用metrics的r2_score来对预测集的拟合优度进行评价
# 用scikit-learn计算MAE
print ("MAE:", metrics.mean_absolute_error(y_test, y_hat)) #计算平均绝对误差
# 用scikit-learn计算MSE
print ("MSE:", metrics.mean_squared_error(y_test, y_hat)) #计算均方误差
# # 用scikit-learn计算RMSE
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat))) #计算均方根误差