0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Google產(chǎn)品分析Zlatan Kremonic分享了參加Kaggle競(jìng)賽的經(jīng)驗(yàn)

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-08-10 09:02 ? 次閱讀

編者按:Google產(chǎn)品分析Zlatan Kremonic分享了參加Kaggle競(jìng)賽的經(jīng)驗(yàn)。

問題

Kaggle房?jī)r(jià)競(jìng)賽要求參賽者預(yù)測(cè)2006年至2010年美國(guó)愛荷華州埃姆斯市的房?jī)r(jià)。數(shù)據(jù)集中包含79個(gè)變量,包括許多房屋屬性。你可以在Kaggle網(wǎng)站上了解更多細(xì)節(jié):https://www.kaggle.com/c/house-prices-advanced-regression-techniques

方法

由于我們的目標(biāo)變量是連續(xù)值(售價(jià)),因此這是一個(gè)典型的回歸問題,讓人聯(lián)想起波斯頓房?jī)r(jià)數(shù)據(jù)集。評(píng)估標(biāo)準(zhǔn)為預(yù)測(cè)和實(shí)際售價(jià)的接近程度(預(yù)測(cè)值的對(duì)數(shù)與觀測(cè)到的售價(jià)的對(duì)數(shù)的均方根誤差)。

數(shù)據(jù)集中包括大量變量,其中許多是類別變量,因此特征選取是這一問題的關(guān)鍵部分。特征選取的兩種常用方法:

直接使用scikit-learn中的SelectKBest方法。

LASSO回歸。

我在分析中嘗試了這兩種方法,發(fā)現(xiàn)LASSO回歸的結(jié)果要好一些。

另外,我們將使用XGBoost,并在結(jié)果中融合LASSO的輸出,以提升模型的精確度。我們的最終結(jié)果不錯(cuò),位于排行榜的前10%(撰寫本文時(shí))。

探索性數(shù)據(jù)分析

因?yàn)樽兞亢芏?,為了?jié)約篇幅,我不會(huì)詳細(xì)演示所有探索性數(shù)據(jù)分析(我在文末列出了GitHub倉(cāng)庫(kù)的鏈接,如果你對(duì)探索性數(shù)據(jù)分析的細(xì)節(jié)感興趣,可以查看其中的EDA.ipynb)。相反,我將直接給出我的主要觀察,這些觀察給特征工程提供了信息。

我們有大量的類別屬性,需要進(jìn)行獨(dú)熱編碼。

一些數(shù)值列有null值,需要填充。

許多數(shù)值列的分布比較扭曲,需要處理。

如前所述,為了節(jié)約篇幅,這里僅僅給出導(dǎo)入庫(kù)、加載數(shù)據(jù)的代碼,不包括探索性數(shù)據(jù)分析部分的代碼。

import os

import pandas as pd

import numpy as np

from scipy.stats import skew

from sklearn.model_selection importGridSearchCV

from sklearn.linear_model importLasso

from sklearn.metrics import mean_squared_error

from xgboost.sklearn importXGBClassifier

import xgboost as xgb

import matplotlib.pyplot as plt

%matplotlib inline

train = pd.read_csv(os.path.join('data', 'train.csv'))

test = pd.read_csv(os.path.join('data', 'test.csv'))

y = train.iloc[:, -1]

train = train.iloc[:, 1:-1]

test = test.iloc[:, 1:]

submission = test.iloc[:, 0]

特征工程

首先,我們將MSSubClass變量(表示建筑分類編碼)從數(shù)值轉(zhuǎn)為字符串,因?yàn)檫@些編碼只是無序的類別。

def mssubclass(train, test, cols=['MSSubClass']):

for i in (train, test):

for z in cols:

i[z] = i[z].apply(lambda x: str(x))

return train, test

接著,我們將對(duì)所有數(shù)值特征取對(duì)數(shù),包括因變量。由于數(shù)值特征包含很多零值,我們使用log1p,在取對(duì)數(shù)前先加一。

def log(train, test, y):

numeric_feats = train.dtypes[train.dtypes != "object"].index

for i in (train, test):

i[numeric_feats] = np.log1p(i[numeric_feats])

y = np.log1p(y)

return train, test, y

我們將用每列的均值填充null值:

def impute_mean(train, test):

for i in (train, test):

for s in [k for k in i.dtypes[i.dtypes != "object"].index if sum(pd.isnull(i[k])>0)]:

i[s] = i[s].fillna(i[s].mean())

return train, test

獨(dú)熱編碼時(shí),同樣需要填充null值:

def dummies(train, test):

columns = [i for i in train.columns if type(train[i].iloc[1]) == str or type(train[i].iloc[1]) == float]

for column in columns:

train[column].fillna('NULL', inplace = True)

good_cols = [column+'_'+i for i in train[column].unique()[1:] if i in test[column].unique()]

train = pd.concat((train, pd.get_dummies(train[column], prefix = column)[good_cols]), axis = 1)

test = pd.concat((test, pd.get_dummies(test[column], prefix = column)[good_cols]), axis = 1)

del train[column]

del test[column]

return train, test

整個(gè)特征工程流程:

train, test = mssubclass(train, test)

train, test, y = log(train, test, y)

train, test = lotfrontage(train, test)

train, test = garageyrblt(train, test)

train, test = impute_mean(train, test)

train, test = dummies(train, test)

LASSO回歸

LASSO回歸同時(shí)起到了正則化和特征選取的作用,可以改善模型的預(yù)測(cè)效果。就我們的情況而言,LASSO回歸是完美的算法,因?yàn)樗兄诮档吞卣鲾?shù)并緩解過擬合。

LASSO回歸中需要調(diào)節(jié)的超參數(shù)主要是正則化因子alpha。我們使用GridSearchCV(網(wǎng)格搜索交叉驗(yàn)證)尋找alpha的最優(yōu)值。

alpha_ridge = [1e-5, 1e-4, 1e-3, 1e-2, 1, 5, 10, 20]

coeffs = {}

for alpha in alpha_ridge:

r = Lasso(alpha=alpha, normalize=True, max_iter=1000000)

r = r.fit(train, y)

grid_search = GridSearchCV(Lasso(alpha=alpha, normalize=True), scoring='neg_mean_squared_error',

param_grid={'alpha': alpha_ridge}, cv=10, n_jobs=-1)

grid_search.fit(train, y)

最終我們得到alpha的最佳值0.0001。為了更直觀地理解alpha的影響,我們可以畫出所有alpha值的均方根誤差:

alpha = alpha_ridge

rmse = list(np.sqrt(-grid_search.cv_results_['mean_test_score']))

plt.figure(figsize=(6,5))

lasso_cv = pd.Series(rmse, index = alpha)

lasso_cv.plot(title = "Validation - LASSO", logx=True)

plt.xlabel("alpha")

plt.ylabel("rmse")

現(xiàn)在用模型擬合訓(xùn)練數(shù)據(jù):

lasso = Lasso(alpha=.0001, normalize=True, max_iter=1e6)

lasso = lasso.fit(train, y)

我們的模型有多少列?

coef = pd.Series(lasso.coef_, index = train.columns)

print("Lasso選中了" + str(sum(coef != 0)) + "個(gè)變量,并移除了其他" + str(sum(coef == 0)) + "個(gè)變量")

Lasso選中了103個(gè)變量,并移除了其他142個(gè)變量

此外,我們可以看到,根據(jù)我們的模型,房齡、面積、房屋狀況是最重要的變量。這很符合直覺——在創(chuàng)建模型時(shí)檢查模型是否符合常理總是不錯(cuò)的。

imp_coef = pd.concat([coef.sort_values().head(10),

coef.sort_values().tail(10)])

plt.rcParams['figure.figsize'] = (5.0, 5.0)

imp_coef.plot(kind = "barh")

plt.title("Coefficients in the Lasso Model")

用LASSO模型預(yù)測(cè)測(cè)試數(shù)據(jù),我們得到的均方根誤差為0.1209,這已經(jīng)足以在排行榜上取得前25%的名次了。

XGBoost模型

由于XGBoost在數(shù)據(jù)科學(xué)競(jìng)賽中的強(qiáng)力表現(xiàn),從2016年起,這一算法變得家喻戶曉了。這一算法的挑戰(zhàn)之一是處理大數(shù)據(jù)集時(shí),調(diào)整超參數(shù)耗時(shí)很久。然而,因?yàn)槲覀兊臄?shù)據(jù)集包含不到1500項(xiàng)觀測(cè),所以我覺得這是一個(gè)嘗試XGBoost的好機(jī)會(huì)。為了節(jié)約篇幅,我這里不會(huì)披露超參數(shù)調(diào)整的細(xì)節(jié)。我主要使用的方法是每次交叉驗(yàn)證一到兩個(gè)參數(shù),以免給我的機(jī)器太大的負(fù)擔(dān),同時(shí)在調(diào)整會(huì)話的間隔重新計(jì)算n_estimators的最優(yōu)值。

下面是我實(shí)現(xiàn)的最終模型。它的得分是0.12278,事實(shí)上這比LASSO模型要差。

regr = xgb.XGBRegressor(

colsample_bytree=0.3,

gamma=0.0,

learning_rate=0.01,

max_depth=4,

min_child_weight=1.5,

n_estimators=1668,

reg_alpha=1,

reg_lambda=0.6,

subsample=0.2,

seed=42,

silent=1)

regr.fit(train, y)

y_pred_xgb = regr.predict(test)

融合模型結(jié)果

最后我們需要組合兩個(gè)模型的結(jié)果。我對(duì)兩個(gè)模型的預(yù)測(cè)取了加權(quán)平均。最終的得分是0.11765,明顯比兩個(gè)模型單獨(dú)預(yù)測(cè)的結(jié)果要好。這確認(rèn)了集成學(xué)習(xí)的首要原則,假定誤差率互不相關(guān),集成的誤差率低于單個(gè)模型。

predictions = np.expm1(.6*lasso_pred + .4*y_pred_xgb)

之前在特征工程時(shí)使用了log1p,所以現(xiàn)在用expm1還原原數(shù)值。注意這里給LASSO更大的權(quán)重(0.6),并不是因?yàn)樵跍y(cè)試數(shù)據(jù)上LASSO的表現(xiàn)優(yōu)于XGBoost,而是因?yàn)樵谟?xùn)練數(shù)據(jù)上LASSO的表現(xiàn)優(yōu)于XGBoost(因?yàn)榻5臅r(shí)候不能“偷看”測(cè)試數(shù)據(jù))。

結(jié)語

這項(xiàng)競(jìng)賽是一個(gè)練習(xí)標(biāo)準(zhǔn)回歸技術(shù)的好機(jī)會(huì)。我只進(jìn)行了最少的特征工程就取得了前10%的排名。

除了上面的模型,我也嘗試了SelectKBest(搭配Pipeline和網(wǎng)格搜索),將列數(shù)縮減至138,并得到了0.13215的分?jǐn)?shù)。然而,將其與其他模型融合時(shí),效果不佳。后來我又試了隨機(jī)森林回歸,得分是0.14377,這不算差,但要在我們的集成中加入這個(gè)模型,這個(gè)分?jǐn)?shù)顯然還不夠高。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Google
    +關(guān)注

    關(guān)注

    5

    文章

    1752

    瀏覽量

    57333
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1199

    瀏覽量

    24595

原文標(biāo)題:LASSO回歸與XGBoost:融合模型預(yù)測(cè)房?jī)r(jià)

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Kaggle機(jī)器學(xué)習(xí)/數(shù)據(jù)科學(xué)現(xiàn)狀調(diào)查

    Kaggle 是互聯(lián)網(wǎng)上最著名的數(shù)據(jù)科學(xué)競(jìng)賽平臺(tái)之一,今年 3 月 8 日,這家機(jī)構(gòu)被谷歌收購(gòu),6 月 6 日又宣布用戶數(shù)量超過了 100 萬人。
    的頭像 發(fā)表于 06-29 09:11 ?9794次閱讀
    <b class='flag-5'>Kaggle</b>機(jī)器學(xué)習(xí)/數(shù)據(jù)科學(xué)現(xiàn)狀調(diào)查

    參加“電子產(chǎn)品設(shè)計(jì)與制作”比賽,誰有經(jīng)驗(yàn)?求助。

    馬上就要參加“電子產(chǎn)品設(shè)計(jì)與制作”比賽,由于是第一屆,所以信息相對(duì)給的不足,而本人對(duì)于單片機(jī)還算精通,但是在網(wǎng)上看了下各省歷屆的賽況信息,好像不是很側(cè)重于單片機(jī)編程這一塊,所以比較擔(dān)心一點(diǎn)。因此想
    發(fā)表于 03-29 17:25

    Altera SOPC專題競(jìng)賽-經(jīng)驗(yàn)總結(jié)

    Altera SOPC專題競(jìng)賽-經(jīng)驗(yàn)總結(jié)Altera SOPC專題競(jìng)賽-經(jīng)驗(yàn)總結(jié).docx
    發(fā)表于 08-10 18:19

    我準(zhǔn)備參加和泰杯單片機(jī)應(yīng)用競(jìng)賽,無經(jīng)驗(yàn),請(qǐng)求高人注解

    我準(zhǔn)備參加和泰杯單片機(jī)應(yīng)用競(jìng)賽,無經(jīng)驗(yàn),請(qǐng)求高人注解。我該從哪些方面入手學(xué)習(xí)呢?
    發(fā)表于 12-10 15:07

    有指導(dǎo)學(xué)生參加技能競(jìng)賽的教師嗎?

    有指導(dǎo)學(xué)生參加技能競(jìng)賽的教師嗎?我這邊使用的是YL-236的機(jī)子。每天都訓(xùn)練學(xué)生,自己本身就剛?cè)腴T。所以想找找同伴。
    發(fā)表于 03-04 19:16

    全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽

    參加全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽請(qǐng)搞過的朋友發(fā)點(diǎn)有用的小模塊電路等等的資料,,,,,,,,為大賽做做準(zhǔn)備或者給點(diǎn)經(jīng)驗(yàn)什么的。。。。
    發(fā)表于 07-09 13:29

    參加ti電子競(jìng)賽

    第一次參加電子競(jìng)賽,而且才大二,感覺學(xué)的知識(shí)太少了,參加電子競(jìng)賽,主要知識(shí)是哪些方面的?。?/div>
    發(fā)表于 06-29 09:00

    致正在參加電子競(jìng)賽的你們

    時(shí),舉行2015年全國(guó)大學(xué)生電子競(jìng)賽,開賽前半小時(shí)網(wǎng)上發(fā)題。一、有一個(gè)正確的態(tài)度選擇參加電賽就應(yīng)該盡力把它做好。我相信參加電賽的大部分人都是抱著對(duì)電子的好奇和熱愛,當(dāng)然也有人說我就是
    發(fā)表于 07-28 19:33

    kaggle住宅價(jià)格預(yù)測(cè)

    kaggle房?jī)r(jià)實(shí)戰(zhàn)總結(jié)
    發(fā)表于 08-13 10:08

    kaggle泰坦尼克生存預(yù)測(cè)實(shí)施步驟

    數(shù)據(jù)分析-kaggle泰坦尼克號(hào)生存率分析(入門)個(gè)人總結(jié)
    發(fā)表于 09-05 15:36

    全國(guó)電子設(shè)計(jì)競(jìng)賽_經(jīng)驗(yàn)之談

    全國(guó)電子設(shè)計(jì)競(jìng)賽_經(jīng)驗(yàn)之談,有興趣的同學(xué)可以下載學(xué)習(xí)
    發(fā)表于 05-04 11:31 ?12次下載

    Kaggle沒有否認(rèn)將被谷歌收購(gòu)

    科技博客TechCrunch援引消息人士報(bào)道稱,谷歌正在收購(gòu)Kaggle —— 一個(gè)舉辦數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)競(jìng)賽的平臺(tái)。有關(guān)此次交易的詳細(xì)信息目前還未披露,但是考慮到谷歌本周在舊金山召開Cloud Next云技術(shù)大會(huì),官方消息很可能會(huì)在明天公布。
    發(fā)表于 05-08 08:58 ?662次閱讀

    不用寫一行就帶就可以參加 Kaggle,這個(gè)真香!

    隨著 AI 技術(shù)的不斷發(fā)展與落地,有越來越多的平臺(tái)和工具可供大家使用,這些平臺(tái)針對(duì)不同領(lǐng)域、不同層次的開發(fā)者和學(xué)習(xí)者,只要你想學(xué)就有辦法。但問題是,對(duì)于剛?cè)腴T,沒有多少經(jīng)驗(yàn),對(duì) TensorFlow、PyTorch 等工具和框架也不熟悉的人,能參加這樣的
    的頭像 發(fā)表于 07-18 10:59 ?2971次閱讀

    騰訊宣布其人工智能球隊(duì)獲首屆谷歌足球Kaggle競(jìng)賽冠軍

    12月30日,騰訊宣布其人工智能球隊(duì)摘得了首屆谷歌足球Kaggle競(jìng)賽冠軍。這是一場(chǎng)由Google Research與英超曼城俱樂部在Kaggle平臺(tái)上聯(lián)合舉辦的足球AI比賽,經(jīng)過多輪
    的頭像 發(fā)表于 12-30 15:58 ?1855次閱讀

    如何從13個(gè)Kaggle比賽中挑選出的最好的Kaggle kernel

    。機(jī)器學(xué)習(xí)和圖像分類也不例外,工程師們可以通過參加Kaggle這樣的競(jìng)賽來展示最佳實(shí)踐。在這篇文章中,我將給你很多資源來學(xué)習(xí),聚焦于從13個(gè)Kaggle比賽中挑選出的最好的
    的頭像 發(fā)表于 06-27 09:26 ?1963次閱讀