美文网首页大数据 爬虫Python AI Sql机器学习Python
机器学习实战(3)之使用lasso回归预测房价

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

作者: 柳叶刀与小鼠标 | 来源:发表于2018-10-22 00:15 被阅读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 - 一个正则化参数,用于衡量模型的灵活程度。 正规化越高,我们的模型就越不容易过度拟合。 但是它也会失去灵活性,并且可能无法捕获数据中的所有信号。

    • 第二步 通过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")
    
    
    

    相关文章

      网友评论

        本文标题:机器学习实战(3)之使用lasso回归预测房价

        本文链接:https://www.haomeiwen.com/subject/pufizftx.html