簡介:
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在線