目的
本文使用Python的sklearn类库,基于对机器学习线性回归算法的理论学习,利用sklearn中集成的波士顿房价数据,以此来对线性回归的理论知识进行一次实践总结。
本文不以预测的准确率为目的,只是简单的对机器学习的线性回归等理论知识进行一次实践总结,以此来体验下sklearn类库的使用方法。
美国波士顿房价的数据集是sklearn里面默认的数据集,sklearn内置的数据集都位于datasets子模块下。一共506套房屋的数据,每个房屋有13个特征值。
线性回归
线性回归一般用来解决连续值变量预测问题,针对的是数值型的样本。用来探索自变量和因变量之间的线性相关关系。
线性回归就是值利用样本,产生拟合方程,回归的求解就是求这个回归方程的回归系数。一旦我们得到了这个方程,预测的方法当然十分简单,回归系数乘上输入值再全部相加就得到了预测值。
实现
导入数据集:
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
import sklearn.datasets as datasets
from sklearn.model_selection import train_test_split # 对数据集切分
from sklearn.metrics import r2_score
# 机器算法模型
from sklearn.neighbors import KNeighborsRegressor # KNN,即K近邻算法
from sklearn.linear_model import LinearRegression # 多元线性回归算法
from sklearn.linear_model import Ridge # 线性回归算法Ridge回归,岭回归
from sklearn.linear_model import Lasso # 线性回归算法Lasso回归,可用作特征筛选
from sklearn.tree import DecisionTreeRegressor # 决策树,既可以做分类也可以做回归(本文主要用于分类问题)
from sklearn.svm import SVR # 支持向量机
生成训练数据和测试数据:
# 生成训练数据和测试数据
boston = datasets.load_boston()
train = boston.data # 样本
target = boston.target # 标签
# 切割数据样本集合测试集
X_train, x_test, y_train, y_true = train_test_split(train, target, test_size=0.2) # 20%测试集;80%训练集
# 可视化
data_df = pd.DataFrame(boston.data, columns=boston.feature_names)
data_df['房价值'] = boston.target
data_df.head(10)
# 创建学习模型
knn = KNeighborsRegressor()
linear = LinearRegression()
ridge = Ridge()
lasso = Lasso()
decision = DecisionTreeRegressor()
svr = SVR()
在sklearn中,所有的机器学习算法都以“估计器”的形式来呈现,每一个估计器都是一个类,机器学习模型通过实例化一个估计器的类来进行创建。每一个算法估计器,无论是监督学习算法,还是非监督学习算法,都拥有一个fit()方法,用于接收训练数据集来训练数据。
# 训练模型
knn.fit(X_train, y_train) # 学习率、惩罚项都封装好了
linear.fit(X_train, y_train)
ridge.fit(X_train, y_train)
lasso.fit(X_train, y_train)
decision.fit(X_train, y_train)
svr.fit(X_train, y_train)
# 预测数据
y_pre_knn = knn.predict(x_test)
y_pre_linear = linear.predict(x_test)
y_pre_ridge = ridge.predict(x_test)
y_pre_lasso = lasso.predict(x_test)
y_pre_decision = decision.predict(x_test)
y_pre_svr = svr.predict(x_test)
print(linear.coef_) # w值
print(linear.intercept_) # b值
w值,b值打印结果一览:
[-1.03596002e-01 4.39826541e-02 6.64195258e-03 1.99195785e+00
-1.67453226e+01 3.31670567e+00 1.98640843e-02 -1.35096762e+00
2.84150975e-01 -1.09763500e-02 -1.07148109e+00 8.62201927e-03
-5.94514771e-01]
40.52549272350584
# 评分,R2 决定系数(拟合优度)。模型越好:r2→1;模型越差:r2→0
knn_score = r2_score(y_true, y_pre_knn)
linear_score = r2_score(y_true, y_pre_linear)
ridge_score = r2_score(y_true, y_pre_ridge)
lasso_score = r2_score(y_true, y_pre_lasso)
decision_score = r2_score(y_true, y_pre_decision)
svr_score = r2_score(y_true, y_pre_svr)
# 绘图
# KNN
plt.plot(y_true, label='true')
plt.plot(y_pre_knn, label='knn')
plt.legend()
# Linear
plt.plot(y_true, label='true')
plt.plot(y_pre_linear, label='linear')
plt.legend()
# Ridge
plt.plot(y_true, label='true')
plt.plot(y_pre_ridge, label='ridge')
plt.legend()
# Lasso
plt.plot(y_true, label='true')
plt.plot(y_pre_lasso, label='lasso')
plt.legend()
# Decision
plt.plot(y_true, label='true')
plt.plot(y_pre_decision, label='decision')
plt.legend()
# SVR
plt.plot(y_true, label='true')
plt.plot(y_pre_svr, label='svr')
plt.legend()
plt.show()