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

簡介:

kaggle初學(xué)者,先抄抄別人的代碼

目的是熟悉kaggle分析的流程,并簡單熟悉一下各個包的作用。

正文:

Step 1: 檢視源數(shù)據(jù)集

????——讀入數(shù)據(jù)

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

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

? ? ——檢視數(shù)據(jù)源

????????train_df.head()

? ? ? ? ? ? 看前5行的數(shù)據(jù),對數(shù)據(jù)集字段有個整體了解。

Step 2: 合并數(shù)據(jù)

? ? ? ? ? ? 目的是為了方便數(shù)據(jù)預(yù)處理,之后再將其分開;當(dāng)然之前要將因變量取出。

? ? ? ? ? ? 先看看因變量的分布情況。

? ??????????%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: 變量轉(zhuǎn)化

? ??????????類似『特征工程』。就是把不方便處理或者不unify的數(shù)據(jù)給統(tǒng)一了

? ??????????首先,我們注意到,MSSubClass?的值其實(shí)應(yīng)該是一個category,

????????????但是Pandas是不會懂這些事兒的。使用DF的時(shí)候,這類數(shù)字符號會被默認(rèn)記成數(shù)字。

????????????這種東西就很有誤導(dǎo)性,我們需要把它變回成string

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

? ? ? ? ? ? ? ? ? ? ? ? ? ? ——轉(zhuǎn)換為str

????????????all_df['MSSubClass'].value_counts()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ——計(jì)數(shù)


????——把category的變量轉(zhuǎn)變成numerical表達(dá)形式

????????????pandas自帶的get_dummies方法,可以 一鍵 One-Hot

? ? ? ? ? ? all_dummy_df = pd.get_dummies(all_df)

? ? ——處理好numerical變量

? ??????????就算是numerical的變量,也還會有一些小問題。

????????????比如,有一些數(shù)據(jù)是缺失的,首先查看;

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

? ? ? ? ? ? 接下來填補(bǔ),本次選用平均值,最后檢查一下

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


????——標(biāo)準(zhǔn)化numerical數(shù)據(jù)

? ? ? ? ? ? 首先查找numerical數(shù)據(jù)

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

????????????計(jì)算標(biāo)準(zhǔn)分布:(X-X')/s

????????????讓我們的數(shù)據(jù)點(diǎn)更平滑,更便于計(jì)算。

????????????注意:我們這里也是可以繼續(xù)使用Log的,我只是給大家展示一下多種“使數(shù)據(jù)平滑”的辦法。

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: 建立模型


????——把數(shù)據(jù)集分回 訓(xùn)練/測試集


????????????dummy_train_df=all_dummy_df.loc[train_df.index]

? ? ? ? ? ? dummy_test_df=all_dummy_df.loc[test_df.index]


? ? ——Ridge Regression

????????????用Ridge Regression模型來跑一遍看看。(對于多因子的數(shù)據(jù)集,這種模型可以方便的把所有的var都無腦的放進(jìn)去)

????????????from sklearn.linear_mode limport Ridge

????????????from sklearn.model_selection import cross_val_score

????????????這一步不是很必要,只是把DF轉(zhuǎn)化成Numpy Array,這跟Sklearn更加配

????????????X_train=dummy_train_df.values

????????????X_test=dummy_test_df.values

????????????效果如下:


? ? ——用Sklearn自帶的cross validation方法來測試模型

alphas=np.logspace(-3,2,50)? ?——正則化參數(shù)

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值更好(也就是『調(diào)參數(shù)』)

????????????import matplotlib.pyplotasplt

????????????%matplotlibinline

????????????plt.plot(alphas,test_scores)

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


????????????可見,大概alpha=10~20的時(shí)候,可以把score達(dá)到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:? ? ——每棵樹可以使用的最大特征數(shù)量

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——n_estimators:數(shù)的數(shù)量(默認(rèn)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的最優(yōu)值達(dá)到了0.137

Step 5: Ensemble

????????????這里我們用一個Stacking的思維來汲取兩種或者多種模型的優(yōu)點(diǎn)

????????????首先,我們把最好的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)

????????????上面提到了,因?yàn)樽钋懊嫖覀兘olabel做了個log(1+x), 于是這里我們需要把predit的值給exp回去,并且減掉那個"1"

????????????所以就是我們的expm1()函數(shù)。

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

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

????????????一個正經(jīng)的Ensemble是把這群model的預(yù)測結(jié)果作為新的input,再做一次預(yù)測。這里我們簡單的方法,就是直接『平均化』。

y_final=(y_ridge+y_rf)/2

Step 6: 提交結(jié)果

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


參考:July在線

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容