机器学习实战(3)之使用lasso回归预测房价
上一篇
机器学习实战(2)之预测房价 - 简书
https://www.jianshu.com/p/98b6e874a854
现在我们将使用scikit学习模块中的正则化线性回归模型。 我将尝试l_1(Lasso)和l_2(Ridge)正则化。我还将定义一个返回交叉验证rmse错误的函数,以便我们可以评估我们的模型并选择最佳调整标准
-
第一步 定义模型
# In[*]
- ### 第一步 定义模型
# In[*]
from sklearn.linear_model import Ridge, RidgeCV, ElasticNet, LassoCV, LassoLarsCV
from sklearn.model_selection import cross_val_score
def rmse_cv(model):
rmse= np.sqrt(-cross_val_score(model, X_train, y,
scoring="neg_mean_squared_error", cv = 5))
return(rmse)
model_ridge = Ridge()
# In[*]
alphas = [0.05, 0.1, 0.3, 1, 3, 5, 10, 15, 30, 50, 75]
cv_ridge = [rmse_cv(Ridge(alpha = alpha)).mean()
for alpha in alphas]
Ridge模型的主要调整参数是alpha - 一个正则化参数,用于衡量模型的灵活程度。 正规化越高,我们的模型就越不容易过度拟合。 但是它也会失去灵活性,并且可能无法捕获数据中的所有信号。
-
第二步 通过RMSE挑选最佳alpha
# In[*]
- ### 第二步 通过RMSE挑选最佳alpha
# In[*]
cv_ridge = pd.Series(cv_ridge, index = alphas)
cv_ridge.plot(title = "Validation")
plt.xlabel("alpha")
plt.ylabel("rmse")
cv_ridge.min()
0.12733734668670788
当alpha太大时,正则化太强,模型无法识别数据中的复杂性,会出现欠拟合。 然而,如果我们让模型过于灵活(alpha小),模型就会开始过度拟合。 根据上图,alpha = 10的值大约是正确的。
因此对于岭回归(ridge)我们得到约0.127的rmse
然后对于Lasso模型,我们将在这里采用略微不同的方法,并使用内置的Lasso CV为我们找出最佳的alpha。 出于某种原因,Lasso CV中的alpha实际上是Ridge中的alpha或alpha。
-
第三步 通过lasso模型挑选最佳alpha
# In[*]
#第三步 通过lasso模型挑选最佳alpha
# In[*]
model_lasso = LassoCV(alphas = [1, 0.1, 0.001, 0.0005]).fit(X_train, y)
rmse_cv(model_lasso).mean()
0.12314421090977441
通过lasso(套索)回归在RMSE上表现得更好,所以我们只是用这个来预测测试集。 关于lasso的另一个好处是它为你做了特征选择 - 它将把不重要的特征系数为零。
-
第四步 查看lasso回归变量系数
# In[*]
##第四步 查看lasso回归变量系数
# In[*]
coef = pd.Series(model_lasso.coef_, index = X_train.columns)
print("Lasso picked " + str(sum(coef != 0)) +
" variables and eliminated the other " +
str(sum(coef == 0)) + " variables")
print("Lasso picked " + str(sum(coef != 0)) +
" variables and eliminated the other " +
str(sum(coef == 0)) + " variables")
Lasso picked 110 variables and eliminated the other 178 variables
coef
Out[77]:
MSSubClass -0.007480
LotFrontage 0.000000
LotArea 0.071826
OverallQual 0.053160
OverallCond 0.043027
YearBuilt 0.001777
YearRemodAdd 0.000722
MasVnrArea -0.000194
BsmtFinSF1 0.009292
BsmtFinSF2 -0.001385
BsmtUnfSF -0.003975
TotalBsmtSF 0.019208
1stFlrSF 0.030350
2ndFlrSF -0.003396
-
第五步 查看最重要的变量和最不重要的变量
# In[*]
#第五步 查看最重要的变量和最不重要的变量
# In[*]
imp_coef = pd.concat([coef.sort_values().head(10),
coef.sort_values().tail(10)])
matplotlib.rcParams['figure.figsize'] = (8.0, 10.0)
imp_coef.plot(kind = "barh")
plt.title("Coefficients in the Lasso Model")
由上图我们可以看到影响房价的最重要的积极特征是GrLivArea--(地上平方英尺面积)。 这比较符合常理。 然后,一些其他位置和质量特征也对房价有着正向贡献。 一些负面特征不太有意义,值得研究更多 - 似乎它们可能来自不平衡的分类变量。
另请注意,与从随机森林中获得的特征重要性不同,这些是模型中的实际系数 - 因此您可以准确地说出为什么预测价格就是这样(随机森林不能输出房价的最终计算系数,而lasso可以)。 这里唯一的问题是我们log_transformed目标和数字功能,所以实际的幅度有点难以解释。
-
第六步 查看预测值和真实值之差
# In[*]
#第六步 查看预测值和真实值之差
# In[*]
#let's look at the residuals as well:
matplotlib.rcParams['figure.figsize'] = (6.0, 6.0)
preds = pd.DataFrame({"preds":model_lasso.predict(X_train), "true":y})
preds["residuals"] = preds["true"] - preds["preds"]
preds.plot(x = "preds", y = "residuals",kind = "scatter")