成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Kaggle入門(mén)級(jí)賽題:房?jī)r(jià)預(yù)測(cè)——數(shù)據(jù)挖掘篇

joyqi / 3394人閱讀

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

特征工程

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

all_df["MSSubClass"].dtypes

有:

dtype("int64")

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

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

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

all_df["MSSubClass"].value_counts()

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

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

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

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

效果如下:

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

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

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

此時(shí),數(shù)據(jù)長(zhǎng)這樣子:

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

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

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

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

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

再次查看是否有缺失值:

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

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

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

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

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

采用公式(X-X")/s,計(jì)算標(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()

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

建立模型

首先,把數(shù)據(jù)集分回訓(xùn)練集和測(cè)試集:

dummy_train_df = all_dummy_df.loc[train_df.index]
dummy_test_df = all_dummy_df.loc[test_df.index]

首先采用 Ridge Regression 模型,因?yàn)閷?duì)于多因子的數(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 方法來(lái)測(cè)試模型:

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 值,看看哪個(gè) alpha 值更好,也就是我們常說(shuō)的調(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 的時(shí)候,CV Error 達(dá)到最低 0.135 左右。也就是說(shuō)大約 alpha = 15 的時(shí)候給了我們最好的結(jié)果。

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

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

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 個(gè)小的 ridge 分類(lèi)器就達(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 個(gè)小的 ridge 分類(lèi)器的效果,達(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 的時(shí)候,效果接近 0.125!

提交結(jié)果

最后,我們將訓(xùn)練好的模型對(duì)數(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ù)長(zhǎng)這樣子:

submission_df.head()

將它存為.csv文件:

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

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

后記

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


不足之處,歡迎指正。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/44998.html

相關(guān)文章

  • Kaggle入門(mén)級(jí)賽題房?jī)r(jià)預(yù)測(cè)——數(shù)據(jù)分析

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

    sarva 評(píng)論0 收藏0
  • 植被類(lèi)型預(yù)測(cè)

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

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

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

    iOS122 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<