本文改编自《阿里云天池大赛赛题解析-机器学习篇》的第一部分工业蒸汽量预测的第四章-模型训练的内容。根据原有内容进行了部分素材的替换和知识点的归纳总结。sklearn模型训练步骤的总结,以及对线性回归、K近邻回归、树回归、随机森林和LightGBM回归的使用介绍
4 模型训练
4.1回归及相关模型
4.1.1 回归的概念
回归是一种来自统计的技术,用于在目标数量连续时预测所需目标数量的值。通过房屋面积来预测房屋的价格就是一个典型的回归问题,如下图所示。
4.1.2 回归模型训练和预测
回归模型训练和预测的步骤:
(1)导入需要的工具库。
(2)对数据预处理,包括导入数据集、处理数据、特征工程等操作,具体为缺失值处理、连续型特征归一化、类别型特征转化等。
(3)训练模型。选择合适的机器学习模型,利用训练集对模型进行训练,达到最佳拟合效果。
(4)预测结果。将待预测的数据集输入到训练好的模型中,得到预测结果。
4.1.3 线性回归模型
假定因变量Y与自变量X呈线性相关,则可以采用线性模型找出自变量X和因变量Y的关系,以便预测新的自变量X的值,这就是线性回归模型。
1.一元线性回归模型
一元线性回归模型使用单一特征来预测目标变量,拟合的最佳曲线通过最小化预测值和真实值之间的误差得到。
2.多元线性回归模型
多元线性回归模型是利用多个自变量估计因变量,从而解释和预测因变量的值。多元线性回归模型的一般形式:
y
=
β
0
+
β
1
x
1
+
β
2
x
2
+
.
.
.
+
β
p
x
p
+
ϵ
y=\beta_0 + \beta_1x_1+\beta_2x_2+...+\beta_px_p+\epsilon
y=β0+β1x1+β2x2+...+βpxp+ϵ
写成矩阵形式为
y
=
x
β
+
ϵ
y=x\beta+\epsilon
y=xβ+ϵ,其中,
y = ( y 1 y 1 y 2 . . . y n ) y=\begin{pmatrix}y_1\\ y_1\\y_2\\...\\y_n\\\end{pmatrix} y=⎝⎜⎜⎜⎜⎛y1y1y2...yn⎠⎟⎟⎟⎟⎞ | x = ( 1 x 11 x 12 . . . x 1 p 1 x 21 x 22 . . . x 2 p . . . . . . . . . . . . . . . 1 x n 1 x n 2 . . . x n p ) n ∗ ( p + 1 ) {x=\begin{pmatrix}1&x_{11}&x_{12}&...&x_{1p}\\1&x_{21}&x_{22}&...&x_{2p}\\...&...&...&...&...\\1&x_{n1}&x_{n2}&...&x_{np}\\\end{pmatrix}}_{n*(p+1)} x=⎝⎜⎜⎛11...1x11x21...xn1x12x22...xn2............x1px2p...xnp⎠⎟⎟⎞n∗(p+1) | β = ( β 0 β 1 . . . β p ) \beta=\begin{pmatrix}\beta_0\\\beta_1\\...\\\beta_p\\\end{pmatrix} β=⎝⎜⎜⎛β0β1...βp⎠⎟⎟⎞ | ϵ = ( ϵ 0 ϵ 1 . . . ϵ p ) \epsilon=\begin{pmatrix}\epsilon_0\\\epsilon_1\\...\\\epsilon_p\\\end{pmatrix} ϵ=⎝⎜⎜⎛ϵ0ϵ1...ϵp⎠⎟⎟⎞ |
例如,房价可能跟城镇人口犯罪率、一氧化氮浓度(每1000万份)、辐射状公路的可达性指数、城镇师生比例等等因素都有关系,因此可以建立如下模型:
s
a
l
e
s
=
β
0
+
β
1
∗
C
R
I
M
+
β
2
∗
N
O
X
+
β
3
∗
R
A
D
+
β
4
∗
R
T
R
A
T
I
O
sales = \beta_0 + \beta_1*CRIM+\beta_2*NOX+\beta_3*RAD+\beta_4*RTRATIO
sales=β0+β1∗CRIM+β2∗NOX+β3∗RAD+β4∗RTRATIO
3.线性回归调用方法
首先对预处理后的数据进行特征工程,主要是PCA降维,保留16个特征维度的数据量。第一部分的代码需要第三章特征工程里的内容,有需求的小伙伴可以转至工业蒸汽量预测-特征工程
from sklearn.model_selection import train_test_split
new_train_pca_16 = new_train_pca_16.fillna(0)
train = new_train_pca_16[new_test_pca_16.columns]
target = new_train_pca_16['target']
# 切分数据,训练数据为80%,验证数据为20%
train_data,test_data,train_target,test_target = train_test_split(train,target,test_size=0.2,random_state=0)
第二部分的模型训练的基本套路如下:
- 导入对于的模型类 from sklearn.xxx import xxx
- 获取对于模型类的对象 xx = xxx()
- 用数据去训练模型(训练模型参数) xx.fit(data,target)或xx.fit_transform(train_data,train_target)。后者(fit_transform)是在前者的基础上增加了数据处理(特征工程等一些方法)
- 使用训练好的模型(对象)去对测试数据进行预测或分类 xx.predict(test_data)
- 通过各种评价指标计算得分 score = xyz(test_target,predict)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
clf = LinearRegression()
clf.fit(train_data,train_target)
test_predict = clf.predict(test_data)
score = mean_squared_error(test_target,test_predict)
print("LinearRegression: ",score)
# 结果 LinearRegression: 0.27169582706646955
4.1.4 K近邻回归模型
1.K近邻回归介绍
K近邻算法不仅可以用来分类,还可以用于回归。通过找出某个样本的K个最近邻居,将这些邻居的某个(些)属性的平均值赋给该样本,就可以得到该样本对应属性的值。
2.K近邻回归调用方法
如何才能知道哪些数据样本最相近呢?设有两个点P和Q其中
P
=
p
1
,
p
2
,
p
3
,
.
.
.
,
p
n
,
Q
=
q
1
,
q
2
,
q
3
,
.
.
.
,
q
n
P = p_1,p_2,p_3,...,p_n, Q=q_1,q_2,q_3,...,q_n
P=p1,p2,p3,...,pn,Q=q1,q2,q3,...,qn
那么P与Q之间的距离表示为
d
d
d,则根据欧式距离公式如下所示。
d
=
(
p
1
−
q
1
)
2
+
(
p
2
−
q
2
)
2
+
.
.
.
+
(
p
n
−
q
n
)
2
d=\sqrt{(p_1-q_1)^2+(p_2-q_2)^2+...+(p_n-q_n)^2}
d=(p1−q1)2+(p2−q2)2+...+(pn−qn)2
使用sklearn调用K近邻回归算法进行预测。
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
scores = []
for i in range(1,10):
knf = KNeighborsRegressor(n_neighbors=i)
knf.fit(train_data,train_target)
test_predict = knf.predict(test_data)
score = mean_squared_error(test_target,test_predict)
scores.append(score)
plt.figure(figsize=(13,8))
plt.plot(range(1,10),scores)
plt.title('KNeighborsRegressor K-MSE')
plt.xlabel('k')
plt.ylabel('MSE score')
4.1.5 决策树回归模型
1.决策树回归模型介绍
决策树回归可以理解为根据一定准则(评估方式),将一个空间划分为若干个子空间,然后利用子空间内所有点的信息表示这个子空间的值。
2.决策树回归模型举例
3.决策树回归调用方法
from sklearn.tree import DecisionTreeRegressor
DTR = DecisionTreeRegressor()
DTR.fit(train_data,train_target)
test_pred = DTR.predict(test_data)
score = mean_squared_error(test_target,test_pred)
print("DecisionTreeRegressor",score)
4.1.6 集成学习回归模型
1.随机森林回归模型
from sklearn.ensemble import RandomForestRegressor
clf = RandomForestRegressor(n_estimators=200) # 200棵树模型
clf.fit(train_data,train_target)
test_predict = clf.predict(test_data)
score = mean_squared_error(test_target,clf.predict(test_data))
print('RandomForestRegressor score',score)
2.LightGBM回归模型
3.其他常用模型
弹性网络(Elastic Net)回归是在参数空间中对L1和L2范数进行正则化的线性回归模型,可以理解为岭回归和Lasso回归的结合,其主要用在正则化融合的技术中。
SVR(Support Vector Regression)是支持向量机在线性回归模型中的应用。支持向量机主要用于分类。这类模型的优势在采用核函数后,可以自动升维拟合,提高拟合效果,并且参数计算量并没有增加。
4.2 赛题模型训练
4.2.1 导入相关库
from sklearn.neighbors import KNeighborsRegressor # K近邻回归
from sklearn.linear_model import LinearRegression # 线性回归
from sklearn.tree import DecisionTreeRegressor # 决策树回归
from sklearn.ensemble import RandomForestRegressor # 随机森林
from sklearn.svm import SVR #支持向量回归
import lightgbm as lgb # LightGBM模型
from sklearn.metrics import mean_squared_error # 评价指标 MSE
from sklearn.model_selection import train_test_split # 数据集切分
from sklearn.model_selection import learning_curve
from sklearn.model_selection import ShuffleSplit
4.2.2 切分数据
对训练集进行切分,得到80%的训练数据和20%验证数据。
from sklearn.model_selection import train_test_split
new_train_pca_16 = new_train_pca_16.fillna(0)
train = new_train_pca_16[new_test_pca_16.columns]
target = new_train_pca_16['target']
# 切分数据,训练数据为80%,验证数据为20%
train_data,test_data,train_target,test_target = train_test_split(train,target,test_size=0.2,random_state=0)
4.2.3 多元线性回归
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
reg_linear = LinearRegression()
reg_linear.fit(train_data,train_target)
test_predict = reg_linear.predict(test_data)
score = mean_squared_error(test_target,reg_linear.predict(test_data))
print("LinearRegression MSE: ",score)
#LinearRegression MSE: 0.27169238212011
优点:模型简单,部署方便,回归权重可以用于结果分析;训练快。
缺点:精度低,特征存在一定的共线性问题。
使用技巧:需要进行归一化处理,建议进行一定的特征选择,尽量避免高度相关的特征同时存在
4.2.4 K近邻回归
reg_KNN = KNeighborsRegressor(n_neighbors=5)
reg_KNN.fit(train_data,train_target)
test_pred = reg_KNN.predict(test_data)
score = mean_squared_error(test_target,reg_KNN.predict(test_data))
print("KNeighborsRegressor MSE: ",score)
# KNeighborsRegressor MSE: 0.2661117858823529
优点:模型简单,易于理解,对于数据量小的情况方便修改,可视化方便
缺点:计算量大,不适合数据量大的情况;需要调参数。
使用技巧:特征需要归一化,重要的特征可以适当加一定比例的权重
4.2.5 随机森林回归
reg_RFR = RandomForestRegressor(n_estimators=200)
reg_RFR.fit(train_data,train_target)
test_pred = reg_RFR.predict(test_data)
score = mean_squared_error(test_target,reg_RFR.predict(test_data))
print("RandomForestRegressor MSE: ",score)
# RandomForestRegressor MSE: 0.2504218045885812
优点:使用方便,特征无须做过多变换,精度较高;模型并行训练快。
缺点:结果不容易解释
使用技巧:参数调节,提高精度。
本题结果:比较合适
4.2.5 LGB模型回归
reg_lgb = lgb.LGBMRegressor(
learning_rate=0.01,
max_depth=-1,
n_estimators=5000,
boosting_type='gbdt',
random_state=2019,
objective='regression',
)
#训练模型
reg_lgb.fit(train_data,train_target)
score = mean_squared_error(test_target,reg_lgb.predict(test_data))
print('LightGBM socre ',score)
#LightGBM socre 0.24271210461687062
优点:精度高。
缺点:训练时间长,模型复杂。
使用技巧:有效的验证集防止过拟合;参数搜索。
本题结果:适用。