成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Kaggle入門級賽題:房價預(yù)測——數(shù)據(jù)挖掘篇

joyqi / 3339人閱讀

摘要:到這里,我們經(jīng)過以上步驟處理過的數(shù)據(jù),就可以喂給分類器進(jìn)行訓(xùn)練了。一般來說,單個分類器的效果有限。我們會傾向于把多個分類器合在一起,做一個綜合分類器以達(dá)到最好的效果。比理論上更高級點(diǎn),它也是攬來一把的分類器。

特征工程

我們注意到 MSSubClass 其實(shí)是一個 category 的值:

all_df["MSSubClass"].dtypes

有:

dtype("int64")

它不應(yīng)該做為數(shù)值型的值進(jìn)行統(tǒng)計。因此,進(jìn)行強(qiáng)制類型轉(zhuǎn)換,把它變回 string

df["MSSubClass"] =df["MSSubClass"].astype(str) 

然后,統(tǒng)計其出現(xiàn)頻次:

all_df["MSSubClass"].value_counts()

就很清楚的了解 MSSubClass 特征了。

當(dāng)我們用 numerical 來表達(dá) categorical 的時候要注意,數(shù)字本身有大小的含義,所以亂用數(shù)字會給之后的模型學(xué)習(xí)帶來麻煩。這里我們可以用 One-Hot 的方法來表達(dá) category。

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

pd.get_dummies(df["MSSubClass"], prefix="MSSubClass").head()

效果如下:

此時,MSSubClass 被我們分成了 12 列,每列代表一個 category,是為 1,否為 0。

所以,同理。接下來,我們需要把所有的 category 數(shù)據(jù)全部一鍵 One-Hot

all_dummy_df = pd.get_dummies(df)
all_dummy_df.head()

此時,數(shù)據(jù)長這樣子:

接下來,我們來處理 numerical 的數(shù)據(jù)。

首先查看 One-Hot 后的缺失值:

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

我們需要對這些缺失值進(jìn)行處理,這里采用平均值來填充空缺:

mean_cols = all_dummy_df.mean()
all_dummy_df = all_dummy_df.fillna(mean_cols)

再次查看是否有缺失值:

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

顯示為 0,即缺失值都已被填充。

到這里,我們經(jīng)過以上步驟處理過的數(shù)據(jù),就可以喂給分類器進(jìn)行訓(xùn)練了。為了讓數(shù)據(jù)更加規(guī)整化,數(shù)據(jù)間的差距不要太大,在一個標(biāo)準(zhǔn)分布內(nèi),也就是數(shù)據(jù)平滑化。我們對那些本來就是 numerical 的數(shù)據(jù)進(jìn)行處理(與 One-Hot 的 0/1 數(shù)據(jù)不同)。

首先,我們來查看哪些是 numerical 的數(shù)據(jù):

numeric_cols = df.columns[df.dtypes != "object"]
numeric_cols

采用公式(X-X")/s,計算標(biāo)準(zhǔn)分布:

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

得到的數(shù)據(jù)如下:

all_dummy_df.head()

以上就完成了對數(shù)據(jù)的處理。

建立模型

首先,把數(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 模型,因?yàn)閷τ诙嘁蜃拥臄?shù)據(jù)集,這種模型可以方便的把所有的變量都一股腦的放進(jìn)去,我們先用這種模型做實(shí)驗(yàn)。

為了更好的使用 Sklearn,我在這里把 DataFrame 轉(zhuǎn)化成 Numpy Array(這一步不是必須):

X_train = dummy_train_df.values
X_test = dummy_test_df.values

把數(shù)據(jù)放到模型里跑一遍,用 Sklearn 自帶的 cross validation 方法來測試模型:

from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score

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 值更好,也就是我們常說的調(diào)參數(shù)

plt.plot(alphas, test_scores)
plt.title("Alpha vs CV Error")
plt.xlabel("alpha")
plt.ylabel("CV Error")

可以看到,當(dāng) alpha 為 10 到 20 的時候,CV Error 達(dá)到最低 0.135 左右。也就是說大約 alpha = 15 的時候給了我們最好的結(jié)果。

一般來說,單個分類器的效果有限。我們會傾向于把多個分類器合在一起,做一個“綜合分類器”以達(dá)到最好的效果。所以接下來我們要做的事就是 ensemble。

Ensemble 的方法有 BaggingBoosting 兩大類。Bagging 把很多的小分類器放在一起,每個訓(xùn)練隨機(jī)的一部分?jǐn)?shù)據(jù),然后采用多數(shù)投票制把它們的最終結(jié)果綜合起來。Boosting 比 Bagging 理論上更高級點(diǎn),它也是攬來一把的分類器。但是把他們線性排列。下一個分類器把上一個分類器分類得不好的地方加上更高的權(quán)重,這樣下一個分類器就能在這個部分學(xué)得更加“深刻”。下面我們分別來看一下。

Bagging

from sklearn.ensemble import BaggingRegressor
from sklearn.model_selection import cross_val_score

params = [1, 10, 15, 20, 25, 30, 40]
test_scores = []
for param in params:
    clf = BaggingRegressor(n_estimators=param, base_estimator=ridge)
    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))
    
plt.plot(params, test_scores)
plt.title("n_estimator vs CV Error")

可以看到,我們用 15 個小的 ridge 分類器就達(dá)到了 0.134 以下的效果。

Boosting

from sklearn.ensemble import AdaBoostRegressor

params = [10, 15, 20, 25, 30, 35, 40, 45, 50]
test_scores = []
for param in params:
    clf = BaggingRegressor(n_estimators=param, base_estimator=ridge)
    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))
    
plt.plot(params, test_scores)
plt.title("n_estimator vs CV Error");

20 個小的 ridge 分類器的效果,達(dá)到了 0.133。

最后,祭出 xgboost 大殺器:

from xgboost import XGBRegressor

params = [1,2,3,4,5,6]
test_scores = []
for param in params:
    clf = XGBRegressor(max_depth=param)
    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))

plt.plot(params, test_scores)
plt.title("max_depth vs CV Error")

我們看到,當(dāng)參數(shù)為 5 的時候,效果接近 0.125!

提交結(jié)果

最后,我們將訓(xùn)練好的模型對數(shù)據(jù)進(jìn)行訓(xùn)練:

xgb = XGBRegressor(max_depth=5)
xgb.fit(X_train, y_train)
y_xgb = np.expm1(xgb.predict(X_test))
submission_df = pd.DataFrame(data= {"Id" : test_df.index, "SalePrice": y_xgb})

最終,我們輸出的數(shù)據(jù)長這樣子:

submission_df.head()

將它存為.csv文件:

submission_df.to_csv("submission_xgb.csv",index=False)

提交到 kaggle 平臺的 Score 是 0.13942,排名在 50% 左右。整個過程沒有對特征信息進(jìn)行太多的處理,還有太多需要改進(jìn)的地方。

后記

第一次完完整整的從頭到尾自己做了一個比賽,還是有太多地方淺淺略過,確實(shí),如果只是調(diào)參跑模型的話,應(yīng)該不是難事,但是如何獲得更好的效果,數(shù)據(jù)量大時現(xiàn)有的程序跑不動,需要改進(jìn)算法等方面,還有太多值得學(xué)習(xí)的地方,因?yàn)檫@件事好像沒有一個最優(yōu)結(jié)果,只有更優(yōu)的結(jié)果。


不足之處,歡迎指正。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44998.html

相關(guān)文章

  • Kaggle入門賽題房價預(yù)測——數(shù)據(jù)分析

    摘要:本次分享的項(xiàng)目來自的經(jīng)典賽題房價預(yù)測。分為數(shù)據(jù)分析和數(shù)據(jù)挖掘兩部分介紹。本篇為數(shù)據(jù)分析篇。賽題解讀比賽概述影響房價的因素有很多,在本題的數(shù)據(jù)集中有個變量幾乎描述了愛荷華州艾姆斯住宅的方方面面,要求預(yù)測最終的房價。 本次分享的項(xiàng)目來自 Kaggle 的經(jīng)典賽題:房價預(yù)測。分為數(shù)據(jù)分析和數(shù)據(jù)挖掘兩部分介紹。本篇為數(shù)據(jù)分析篇。 賽題解讀 比賽概述 影響房價的因素有很多,在本題的數(shù)據(jù)集中有 ...

    sarva 評論0 收藏0
  • 植被類型預(yù)測

    摘要:通過海拔坡度到水源的距離地塊位置等特征項(xiàng),對地塊植被的類型進(jìn)行預(yù)測個類型。競賽結(jié)果提交請選手利用建立的模型對每階段提供的預(yù)測數(shù)據(jù)集中的地塊植被類型列進(jìn)行預(yù)測類,預(yù)測結(jié)果按如下格式保存成格式提交。 showImg(https://segmentfault.com/img/bVbjmT7); 參加佛山互聯(lián)網(wǎng)協(xié)會建模大賽,主題為植被類型預(yù)測,數(shù)據(jù)量分3個階段,10/15/15萬左右的放出,暨...

    z2xy 評論0 收藏0
  • Kaggle入門級競賽top5%排名經(jīng)驗(yàn)分享】— 建模

    摘要:提取出中的信息特征缺失值同樣,觀察的缺失值情況缺失值處理發(fā)現(xiàn)兩位都是女性。特征缺失值特征有的缺失值,較為嚴(yán)重,如果進(jìn)行大量的填補(bǔ)會引入更多噪聲。因?yàn)槿笔е狄彩且环N值,這里將缺失值視為一種特殊的值來處理,并根據(jù)首個字符衍生一個新的特征。 作者:xiaoyu 微信公眾號:Python數(shù)據(jù)科學(xué) 知乎:python數(shù)據(jù)分析師 showImg(https://segmentfault.com/...

    iOS122 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<