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

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

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

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

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

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

問題

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

方法

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

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

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

LASSO回歸。

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

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

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

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

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

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

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

如前所述,為了節(jié)約篇幅,這里僅僅給出導(dǎo)入庫、加載數(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)為字符串,因為這些編碼只是無序的類別。

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

接著,我們將對所有數(shù)值特征取對數(shù),包括因變量。由于數(shù)值特征包含很多零值,我們使用log1p,在取對數(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

獨熱編碼時,同樣需要填充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

整個特征工程流程:

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回歸同時起到了正則化和特征選取的作用,可以改善模型的預(yù)測效果。就我們的情況而言,LASSO回歸是完美的算法,因為它有助于降低特征數(shù)并緩解過擬合。

LASSO回歸中需要調(diào)節(jié)的超參數(shù)主要是正則化因子alpha。我們使用GridSearchCV(網(wǎng)格搜索交叉驗證)尋找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)) + "個變量,并移除了其他" + str(sum(coef == 0)) + "個變量")

Lasso選中了103個變量,并移除了其他142個變量

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

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ù)測測試數(shù)據(jù),我們得到的均方根誤差為0.1209,這已經(jīng)足以在排行榜上取得前25%的名次了。

XGBoost模型

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

下面是我實現(xiàn)的最終模型。它的得分是0.12278,事實上這比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é)果

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

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

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

結(jié)語

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

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

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

    關(guān)注

    5

    文章

    1754

    瀏覽量

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

    關(guān)注

    4

    文章

    1200

    瀏覽量

    24621

原文標(biāo)題:LASSO回歸與XGBoost:融合模型預(yù)測房價

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

    全國大學(xué)生電子設(shè)計競賽

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

    參加ti電子競賽

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

    致正在參加電子競賽的你們

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

    kaggle住宅價格預(yù)測

    kaggle房價實戰(zhàn)總結(jié)
    發(fā)表于 08-13 10:08

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

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

    全國電子設(shè)計競賽_經(jīng)驗之談

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

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

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

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

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

    騰訊宣布其人工智能球隊獲首屆谷歌足球Kaggle競賽冠軍

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

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

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