01.Kaggle競(jìng)賽筆記:梅賽德斯 - 奔馳綠色制造

Mercedes-Benz Greener Manufacturing
梅賽德斯 - 奔馳綠色制造

你能減少梅賽德斯 - 奔馳在試驗(yàn)臺(tái)上花費(fèi)的時(shí)間嗎得哆?

01.概述
在這次比賽中贩据,戴姆勒正在挑戰(zhàn)Kagglers解決維度的詛咒并減少汽車在測(cè)試臺(tái)上花費(fèi)的時(shí)間闸餐。競(jìng)爭(zhēng)對(duì)手將使用代表梅賽德斯 - 奔馳汽車功能的不同排列的數(shù)據(jù)集來(lái)預(yù)測(cè)通過(guò)測(cè)試所需的時(shí)間。獲勝算法將有助于加快測(cè)試速度近上,從而降低二氧化碳排放量拂铡,同時(shí)不降低戴姆勒的標(biāo)準(zhǔn)葱绒。

02. 筆記分析

該筆記主要參考https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-mercedes
文章中 關(guān)于 特征提取 以及 查看數(shù)據(jù)分布 的方法很通用哈街,所以做個(gè)記錄以便今后用到拒迅。
細(xì)節(jié)方面會(huì)進(jìn)一步慢慢完善。

導(dǎo)入各類庫(kù)

import numpy as np # linear algebra

import pandas as pd  # data processing, CSV file I/O (e.g. pd.read_csv)

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn import preprocessing

import xgboost as xgb 

color = sns.color_palette()

%matplotlibinlinepd.options.mode.chained_assignment=None #default='warn'

pd.options.display.max_columns=999

from subprocess import check_outputprint(check_output(["ls","../input"]).decode("utf8"))

1.觀察 數(shù)據(jù)情況作箍,以及 target 既數(shù)據(jù) y 的分布

# 讀取數(shù)據(jù)前硫,并輸出數(shù)據(jù)的分布

train_df=pd.read_csv("../input/train.csv")

test_df=pd.read_csv("../input/test.csv")

print("Train shape : ",train_df.shape)

print("Test shape : ",test_df.shape)
print(train_df.head())

# target的分布
plt.figure(figsize=(8,6))
plt.scatter(range(train_df.shape[0]), np.sort(train_df.y.values))
plt.xlabel('index', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.show()    #  觀察數(shù)據(jù)大小分布

#觀察數(shù)據(jù) 分布
ulimit = 180
train_df['y'].ix[train_df['y']>ulimit] = ulimit

plt.figure(figsize=(12,8))
sns.distplot(train_df.y.values, bins=50, kde=False)
plt.xlabel('y value', fontsize=12)
plt.show()
2.觀察 維度情況:個(gè)數(shù)屹电、分布、數(shù)據(jù)類型
# 觀察各維度的數(shù)據(jù)類型危号,個(gè)數(shù)
dtype_df = train_df.dtypes.reset_index()
dtype_df.columns = ["Count", "Column Type"]
dtype_df.groupby("Column Type").aggregate('count').reset_index()

# 可以發(fā)現(xiàn)主要的 特征值 為 非連續(xù)型 為X0-X10
dtype_df.ix[:10,:] # 輸出前10個(gè)特征的值的類型
3. 觀察缺失值的情況
missing_df = train_df.isnull().sum(axis=0).reset_index()
missing_df.columns = ['column_name', 'missing_count']
missing_df = missing_df.ix[missing_df['missing_count']>0]
missing_df = missing_df.sort_values(by='missing_count')
missing_df
4. 觀察 特征值為 二進(jìn)制 類型的 分布情況外莲; 觀察 特征值為  非連續(xù)型 的分布情況
# 觀察特征值為 二進(jìn)制類型的 分布情況
unique_values_dict = {}
for col in train_df.columns:
    if col not in ["ID", "y", "X0", "X1", "X2", "X3", "X4", "X5", "X6", "X8"]:
        unique_value = str(np.sort(train_df[col].unique()).tolist())
        tlist = unique_values_dict.get(unique_value, [])
        tlist.append(col)
        unique_values_dict[unique_value] = tlist[:]
for unique_val, columns in unique_values_dict.items():
    print("Columns containing the unique values : ",unique_val)
    print(columns)
    print("--------------------------------------------------")

# 觀察特征值為 非連續(xù)型 的分布情況
var_name = "X1"  # 只放了X1
col_order = np.sort(train_df[var_name].unique()).tolist()
plt.figure(figsize=(12,6))
sns.stripplot(x=var_name, y='y', data=train_df, order=col_order)
plt.xlabel(var_name, fontsize=12)
plt.ylabel('y', fontsize=12)
plt.title("Distribution of y variable with "+var_name, fontsize=15)
plt.show()

# 按比例來(lái) 觀察 二進(jìn)制類型的 特征 0與1的分布情況
zero_count_list = []
one_count_list = []
cols_list = unique_values_dict['[0, 1]']
for col in cols_list:
    zero_count_list.append((train_df[col]==0).sum())
    one_count_list.append((train_df[col]==1).sum())

N = len(cols_list)
ind = np.arange(N)
width = 0.35

plt.figure(figsize=(6,100))
p1 = plt.barh(ind, zero_count_list, width, color='red')
p2 = plt.barh(ind, one_count_list, width, left=zero_count_list, color="blue")
plt.yticks(ind, cols_list)
plt.legend((p1[0], p2[0]), ('Zero count', 'One Count'))
plt.show()

# 按顏色深淺來(lái) 觀察 二進(jìn)制類型的 特征 0與1的分布情況
zero_mean_list = []
one_mean_list = []
cols_list = unique_values_dict['[0, 1]']
for col in cols_list:
    zero_mean_list.append(train_df.ix[train_df[col]==0].y.mean())
    one_mean_list.append(train_df.ix[train_df[col]==1].y.mean())

new_df = pd.DataFrame({"column_name":cols_list+cols_list, "value":[0]*len(cols_list) + [1]*len(cols_list), "y_mean":zero_mean_list+one_mean_list})
new_df = new_df.pivot('column_name', 'value', 'y_mean')

plt.figure(figsize=(8,80))
sns.heatmap(new_df)
plt.title("Mean of y value across binary variables", fontsize=15)
plt.show()

5. 觀察 ID號(hào):判斷訓(xùn)練集和測(cè)試集的劃分方式【隨機(jī) / 按序】 判斷對(duì)預(yù)測(cè)是否有幫助 【通常作用不大】
# 輸出ID與target的分布
var_name = "ID"
plt.figure(figsize=(12,6))
sns.regplot(x=var_name, y='y', data=train_df, scatter_kws={'alpha':0.5, 's':30})
plt.xlabel(var_name, fontsize=12)
plt.ylabel('y', fontsize=12)
plt.title("Distribution of y variable with "+var_name, fontsize=15)
plt.show()

# 輸出 訓(xùn)練集和測(cè)試集關(guān)于ID的分布
plt.figure(figsize=(6,10))
train_df['eval_set'] = "train"
test_df['eval_set'] = "test"
full_df = pd.concat([train_df[["ID","eval_set"]], test_df[["ID","eval_set"]]], axis=0)

plt.figure(figsize=(12,6))
sns.violinplot(x="eval_set", y='ID', data=full_df)
plt.xlabel("eval_set", fontsize=12)
plt.ylabel('y', fontsize=12)
plt.title("Distribution of ID variable with evaluation set", fontsize=15)
plt.show()

6. 獲取 最重要的特征 : 采用 xgboost 和 隨機(jī)森林 做對(duì)比
# 用xgboost 方法【需進(jìn)一步了解各參數(shù)含義磨确,以及調(diào)參步驟】
for f in ["X0", "X1", "X2", "X3", "X4", "X5", "X6", "X8"]:
        lbl = preprocessing.LabelEncoder()
        lbl.fit(list(train_df[f].values)) 
        train_df[f] = lbl.transform(list(train_df[f].values))
        
train_y = train_df['y'].values
train_X = train_df.drop(["ID", "y", "eval_set"], axis=1)

# Thanks to anokas for this #
def xgb_r2_score(preds, dtrain):
    labels = dtrain.get_label()
    return 'r2', r2_score(labels, preds)

xgb_params = {
    'eta': 0.05,
    'max_depth': 6,
    'subsample': 0.7,
    'colsample_bytree': 0.7,
    'objective': 'reg:linear',
    'silent': 1
}
dtrain = xgb.DMatrix(train_X, train_y, feature_names=train_X.columns.values)
model = xgb.train(dict(xgb_params, silent=0), dtrain, num_boost_round=100, feval=xgb_r2_score, maximize=True)

# plot the important features #
fig, ax = plt.subplots(figsize=(12,18))
xgb.plot_importance(model, max_num_features=50, height=0.8, ax=ax)
plt.show()

# 隨機(jī)森林方法【需進(jìn)一步了解參數(shù)含義和調(diào)參步驟】
from sklearn import ensemble
model = ensemble.RandomForestRegressor(n_estimators=200, max_depth=10, min_samples_leaf=4, max_features=0.2, n_jobs=-1, random_state=0)
model.fit(train_X, train_y)
feat_names = train_X.columns.values

## plot the importances ##
importances = model.feature_importances_
std = np.std([tree.feature_importances_ for tree in model.estimators_], axis=0)
indices = np.argsort(importances)[::-1][:20]

plt.figure(figsize=(12,12))
plt.title("Feature importances")
plt.bar(range(len(indices)), importances[indices], color="r", align="center")
plt.xticks(range(len(indices)), feat_names[indices], rotation='vertical')
plt.xlim([-1, len(indices)])
plt.show()

結(jié)果表明 RF與XGBoost的方法所得最重要的特征差別很大需進(jìn)一步驗(yàn)證。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末英融,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胡野,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龙巨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旨别,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門铭若,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)递览,“玉大人,你說(shuō)我怎么就攤上這事镜雨。” “怎么了荚坞?”我有些...
    開(kāi)封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵颓影,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瞭空,道長(zhǎng)疗我,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任旧找,我火速辦了婚禮麦牺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剖膳。我一直安慰自己吱晒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著氏豌,像睡著了一般泵喘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霹陡,一...
    開(kāi)封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼集峦。 笑死摘昌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稿饰。 我是一名探鬼主播喉镰,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了屁擅?” 一聲冷哼從身側(cè)響起派歌,我...
    開(kāi)封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎早抠,沒(méi)想到半個(gè)月后蕊连,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體甘苍,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡载庭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了序矩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劲绪,靈堂內(nèi)的尸體忽然破棺而出贾富,到底是詐尸還是另有隱情颤枪,我是刑警寧澤扇住,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站女阀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晓淀。 院中可真熱鬧,春花似錦蜈亩、人聲如沸稚配。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臊岸。三九已至扇单,卻和暖如春商模,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背响疚。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工装诡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸦采。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓咕幻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肄程。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354