zoukankan      html  css  js  c++  java
  • 4.2_线性回归案例分析

    线性回归案例分析

    波士顿房价预测

    使用scikit-learn中内置的回归模型对“美国波士顿房价”数据进行预测。对于一些比赛数据,可以从kaggle官网上获取,网址:https://www.kaggle.com/datasets

    1.美国波士顿地区房价数据描述

    from sklearn.datasets import load_boston
    
    boston = load_boston()
    
    print boston.DESCR

    2.波士顿地区房价数据分割

    from sklearn.cross_validation import train_test_split
    import numpy as np
    X = boston.data
    y = boston.target
    
    X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=33,test_size = 0.25)

    3.训练与测试数据标准化处理

    from sklearn.preprocessing import StandardScaler
    ss_X = StandardScaler()
    ss_y = StandardScaler()
    
    X_train = ss_X.fit_transform(X_train)
    X_test = ss_X.transform(X_test)
    y_train = ss_X.fit_transform(y_train)
    X_train = ss_X.transform(y_test)

    4.使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测

    from sklearn.linear_model import LinearRegression
    lr = LinearRegression()
    lr.fit(X_train,y_train)
    lr_y_predict = lr.predict(X_test)
    
    from sklearn.linear_model import SGDRegressor
    sgdr = SGDRegressor()
    sgdr.fit(X_train,y_train)
    sgdr_y_predict = sgdr.predict(X_test)

    5.性能评测

    对于不同的类别预测,我们不能苛刻的要求回归预测的数值结果要严格的与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。因此,可以测评函数进行评价。其中最为直观的评价指标均方误差(Mean Squared Error)MSE,因为这也是线性回归模型所要优化的目标。

    MSE的计算方法如式:

    {MSE=}frac{1}{m}sum_{i=1}^{m}left({y^{i}-ar{y}} ight)^{2}MSE=m1​​i=1m​​(yi​​y¯​​)2​​

    使用MSE评价机制对两种模型的回归性能作出评价

    from sklearn.metrics import mean_squared_error
    
    print '线性回归模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(lr_y_predict))
    print '梯度下降模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(sgdr_y_predict))

    通过这一比较发现,使用梯度下降估计参数的方法在性能表现上不及使用解析方法的LinearRegression,但是如果面对训练数据规模十分庞大的任务,随即梯度法不论是在分类还是回归问题上都表现的十分高效,可以在不损失过多性能的前提下,节省大量计算时间。根据Scikit-learn光网的建议,如果数据规模超过10万,推荐使用随机梯度法估计参数模型。

    注意:线性回归器是最为简单、易用的回归模型。正式因为其对特征与回归目标之间的线性假设,从某种程度上说也局限了其应用范围。特别是,现实生活中的许多实例数据的各种特征与回归目标之间,绝大多数不能保证严格的线性关系。尽管如此,在不清楚特征之间关系的前提下,我们仍然可以使用线性回归模型作为大多数数据分析的基线系统。

    完整代码如下:

    from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
    from sklearn.preprocessing import StandardScaler
    from sklearn.datasets import load_boston
    from sklearn.cross_validation import train_test_split
    from sklearn.metrics import mean_squared_error,classification_report
    from sklearn.cluster import KMeans
    
    
    def linearmodel():
        """
        线性回归对波士顿数据集处理
        :return: None
        """
    
        # 1、加载数据集
    
        ld = load_boston()
    
        x_train,x_test,y_train,y_test = train_test_split(ld.data,ld.target,test_size=0.25)
    
        # 2、标准化处理
    
        # 特征值处理
        std_x = StandardScaler()
        x_train = std_x.fit_transform(x_train)
        x_test = std_x.transform(x_test)
    
    
        # 目标值进行处理
    
        std_y  = StandardScaler()
        y_train = std_y.fit_transform(y_train)
        y_test = std_y.transform(y_test)
    
        # 3、估计器流程
    
        # LinearRegression
        lr = LinearRegression()
    
        lr.fit(x_train,y_train)
    
        # print(lr.coef_)
    
        y_lr_predict = lr.predict(x_test)
    
        y_lr_predict = std_y.inverse_transform(y_lr_predict)
    
        print("Lr预测值:",y_lr_predict)
    
    
        # SGDRegressor
        sgd = SGDRegressor()
    
        sgd.fit(x_train,y_train)
    
        # print(sgd.coef_)
    
        y_sgd_predict = sgd.predict(x_test)
    
        y_sgd_predict = std_y.inverse_transform(y_sgd_predict)
    
        print("SGD预测值:",y_sgd_predict)
    
        # 带有正则化的岭回归
    
        rd = Ridge(alpha=0.01)
    
        rd.fit(x_train,y_train)
    
        y_rd_predict = rd.predict(x_test)
    
        y_rd_predict = std_y.inverse_transform(y_rd_predict)
    
        print(rd.coef_)
    
        # 两种模型评估结果
    
        print("lr的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
    
        print("SGD的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))
    
        print("Ridge的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))
    
        return None

     

  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/alexzhang92/p/10070259.html
Copyright © 2011-2022 走看看