大数据 爬虫Python AI Sql机器学习Python

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

2018-10-22  本文已影响2人  柳叶刀与小鼠标

上一篇

机器学习实战(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 - 一个正则化参数,用于衡量模型的灵活程度。 正规化越高,我们的模型就越不容易过度拟合。 但是它也会失去灵活性,并且可能无法捕获数据中的所有信号。

# 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。

# 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的另一个好处是它为你做了特征选择 - 它将把不重要的特征系数为零。

# 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")


上一篇下一篇

猜你喜欢

热点阅读