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()


            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

            效果如下:


    ——用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");


            可见,大概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")


            用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在线

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容