前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习实战(3)之使用lasso回归预测房价

机器学习实战(3)之使用lasso回归预测房价

作者头像
用户1359560
发布2018-11-08 10:50:37
2.4K0
发布2018-11-08 10:50:37
举报
文章被收录于专栏:生信小驿站生信小驿站

现在我们将使用scikit学习模块中的正则化线性回归模型。 我将尝试l_1(Lasso)和l_2(Ridge)正则化。我还将定义一个返回交叉验证rmse错误的函数,以便我们可以评估我们的模型并选择最佳调整标准

  • 第一步 定义模型
代码语言:javascript
复制
# 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
代码语言:javascript
复制
# 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
代码语言:javascript
复制
# 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回归变量系数
代码语言:javascript
复制
# 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")    
代码语言:javascript
复制
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
  • 第五步 查看最重要的变量和最不重要的变量
代码语言:javascript
复制
# 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目标和数字功能,所以实际的幅度有点难以解释。

  • 第六步 查看预测值和真实值之差
代码语言:javascript
复制
# 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")
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.10.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档