XIN71—第50周—kaggle(house_price精简版)

简介:

kaggle初学者,先抄抄别人的代码

目的是熟悉kaggle分析的流程,并简单熟悉一下各个包的作用。

正文:

Step 1: 检视源数据集

    ——读入数据

        train_df = pd.read_csv('../input/train.csv', index_col=0) 

        test_df =  pd.read_csv('../input/test.csv', index_col=0) 

    ——检视数据源

        train_df.head()

            看前5行的数据,对数据集字段有个整体了解。

Step 2: 合并数据

            目的是为了方便数据预处理,之后再将其分开;当然之前要将因变量取出。

            先看看因变量的分布情况。

            %matplotlib inline

            prices = pd.DataFrame({"price":train_df["SalePrice"],"log(price+1)":             np.log1p(train_df["SalePrice"])})

            prices.hist()


XIN71—第50周—kaggle(house_price精简版)_第1张图片

            y_train=np.log1p(train_df.pop('SalePrice'))

            再把剩下的部分合并起来;

            y_train=np.log1p(train_df.pop('SalePrice'))

Step 3: 变量转化

            类似『特征工程』。就是把不方便处理或者不unify的数据给统一了

            首先,我们注意到,MSSubClass 的值其实应该是一个category,

            但是Pandas是不会懂这些事儿的。使用DF的时候,这类数字符号会被默认记成数字。

            这种东西就很有误导性,我们需要把它变回成string

            all_df['MSSubClass'] = all_df['MSSubClass'].astype(str)

                            ——转换为str

            all_df['MSSubClass'].value_counts()

                            ——计数


    ——把category的变量转变成numerical表达形式

            pandas自带的get_dummies方法,可以 一键 One-Hot

            all_dummy_df = pd.get_dummies(all_df)

    ——处理好numerical变量

            就算是numerical的变量,也还会有一些小问题。

            比如,有一些数据是缺失的,首先查看;

            all_dummy_df.isnull().sum().sort_values(ascending=False).head(10)

            接下来填补,本次选用平均值,最后检查一下

            mean_cols=all_dummy_df.mean()mean_cols.head(10)

            all_dummy_df=all_dummy_df.fillna(mean_cols)

            all_dummy_df.isnull().sum().sum()


    ——标准化numerical数据

            首先查找numerical数据

            numeric_cols=all_df.columns[all_df.dtypes!='object']numeric_cols

            计算标准分布:(X-X')/s

            让我们的数据点更平滑,更便于计算。

            注意:我们这里也是可以继续使用Log的,我只是给大家展示一下多种“使数据平滑”的办法。

numeric_col_means=all_dummy_df.loc[:,numeric_cols].mean()

numeric_col_std = all_dummy_df.loc[:, numeric_cols].std()

all_dummy_df.loc[:, numeric_cols] = (all_dummy_df.loc[:, numeric_cols] - numeric_col_means) / numeric_col_std

Step 4: 建立模型


    ——把数据集分回 训练/测试集


            dummy_train_df=all_dummy_df.loc[train_df.index]

            dummy_test_df=all_dummy_df.loc[test_df.index]


    ——Ridge Regression

            用Ridge Regression模型来跑一遍看看。(对于多因子的数据集,这种模型可以方便的把所有的var都无脑的放进去)

            from sklearn.linear_mode limport Ridge

            from sklearn.model_selection import cross_val_score

            这一步不是很必要,只是把DF转化成Numpy Array,这跟Sklearn更加配

            X_train=dummy_train_df.values

            X_test=dummy_test_df.values

            效果如下:


XIN71—第50周—kaggle(house_price精简版)_第2张图片

    ——用Sklearn自带的cross validation方法来测试模型

alphas=np.logspace(-3,2,50)   ——正则化参数

test_scores=[]

for alpha in alphas:

    clf=Ridge(alpha)

    test_score=np.sqrt(-   cross_val_score(clf,X_train,y_train,cv=10,scoring='neg_mean_squared_error'))

    test_scores.append(np.mean(test_score))

            存下所有的CV值,看看哪个alpha值更好(也就是『调参数』)

            import matplotlib.pyplotasplt

            %matplotlibinline

            plt.plot(alphas,test_scores)

            plt.title("Alpha vs CV Error");


XIN71—第50周—kaggle(house_price精简版)_第3张图片

            可见,大概alpha=10~20的时候,可以把score达到0.135左右。

    ——Random Forest

from sklearn.ensemble import RandomForestRegressor

max_features=[.1,.3,.5,.7,.9,.99]

test_scores=[]

for max_feat in max_features:    ——每棵树可以使用的最大特征数量

                                                    ——n_estimators:数的数量(默认10)

    clf=RandomForestRegressor(n_estimators=200,max_features=max_feat)

    test_score=np.sqrt(-   cross_val_score(clf,X_train,y_train,cv=5,scoring='neg_mean_squared_error'))

    test_scores.append(np.mean(test_score))

plt.plot(max_features,test_scores)

plt.title("Max Features vs CV Error")


XIN71—第50周—kaggle(house_price精简版)_第4张图片

            用RF的最优值达到了0.137

Step 5: Ensemble

            这里我们用一个Stacking的思维来汲取两种或者多种模型的优点

            首先,我们把最好的parameter拿出来,做成我们最终的model

ridge=Ridge(alpha=15)

rf=RandomForestRegressor(n_estimators=500,max_features=.3)

ridge.fit(X_train,y_train)

rf.fit(X_train,y_train)

            上面提到了,因为最前面我们给label做了个log(1+x), 于是这里我们需要把predit的值给exp回去,并且减掉那个"1"

            所以就是我们的expm1()函数。

y_ridge=np.expm1(ridge.predict(X_test))

y_rf=np.expm1(rf.predict(X_test))

            一个正经的Ensemble是把这群model的预测结果作为新的input,再做一次预测。这里我们简单的方法,就是直接『平均化』。

y_final=(y_ridge+y_rf)/2

Step 6: 提交结果

submission_df=pd.DataFrame(data={'Id':test_df.index,'SalePrice':y_final})


参考:July在线

你可能感兴趣的:(XIN71—第50周—kaggle(house_price精简版))