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

資訊專欄INFORMATION COLUMN

人工智障也刷題!Kaggle 入門之實(shí)戰(zhàn)泰坦尼克號(hào)

caoym / 596人閱讀

背景 關(guān)于 Kaggle

https://www.kaggle.com/

這是一個(gè)為你提供完美數(shù)據(jù),為你提供實(shí)際應(yīng)用場(chǎng)景,可以與小伙伴在數(shù)據(jù)挖掘領(lǐng)域 high 的不要不要的的地方?。。?!

Kaggle 是一個(gè)用來(lái)學(xué)習(xí)、分享和競(jìng)賽的線上數(shù)據(jù)實(shí)驗(yàn)平臺(tái),有點(diǎn)類似 KDD—CUP(國(guó)際知識(shí)發(fā)現(xiàn)和數(shù)據(jù)挖掘競(jìng)賽),企業(yè)或者研究者可以將背景、數(shù)據(jù)、期望指標(biāo)等發(fā)布在 kaggle 上,用競(jìng)賽的方式向全世界的數(shù)據(jù)科學(xué)家和愛(ài)好者尋求解決方案。熱愛(ài)數(shù)(dong)據(jù)(shou)挖(zhe)掘(teng)的小伙伴們可以下載/分析數(shù)據(jù),使用統(tǒng)計(jì)/機(jī)器學(xué)習(xí)/數(shù)據(jù)挖掘等方面的知識(shí),建立算法模型,得出結(jié)果并提交,排名靠前可能還會(huì)有獎(jiǎng)勵(lì)哦!

關(guān)于泰坦尼克號(hào)之災(zāi)

https://www.kaggle.com/c/titanic

問(wèn)題背景頁(yè)

下載 Data 的頁(yè)面

泰坦尼克號(hào)問(wèn)題背景

就是大家從小到大被洗腦的“u jump I jump”的「jack 和 rose」的故事了。游艇在撞擊了一個(gè)冰山后沉沒(méi)了。乘客們都驚慌失措,副船長(zhǎng)「lady and kid first」,所以模型不會(huì)向拋硬幣那樣看臉決定你是否獲救。而是有著一定背景的,至于出了女士和孩子優(yōu)先,還有哪些值得我們考慮,這就是稍后我們?cè)谔卣鞴こ讨薪鉀Q的問(wèn)題了。

訓(xùn)練和測(cè)試數(shù)據(jù)是一些乘客的個(gè)人信息以及存活情況,嘗試應(yīng)用這些數(shù)據(jù)來(lái)建立一個(gè)合適的模型進(jìn)行預(yù)測(cè)。

這是一個(gè)二分類問(wèn)題(survived 或者 not),本文嘗試用 logistic regression 來(lái)處理問(wèn)題

說(shuō)明

「沒(méi)有所謂的算法優(yōu)劣,也沒(méi)有絕對(duì)高性能的機(jī)器學(xué)習(xí)算法,只有在特定的場(chǎng)景、數(shù)據(jù)和特征下更合適的機(jī)器學(xué)習(xí)的算法?!褂捎谶€只是在學(xué)習(xí)階段,對(duì)于 XGBC、隨機(jī)森林、SVC 還不了解,本文所用的算法只是 logistic regression。

初識(shí)數(shù)據(jù)

在 Data 下我們會(huì)看到官方給的 train.csv 和 test.csv 兩個(gè)文件,分別是訓(xùn)練和測(cè)試數(shù)據(jù)。我們可以使用 virtualenv 來(lái)創(chuàng)建一個(gè)“隔離”的 python 應(yīng)用環(huán)境(虛擬環(huán)境)。在這里,你不需要考慮系統(tǒng)原有庫(kù)的版本,只需要 pip 來(lái)管理你需要用到的一切。

import pandas as pd 
import numpy as np 
from pandas import Series,DataFrame

data_train = pd.read_csv("./train.csv")
pd.DataFrame(data_train)

pandas 是常用的 python 數(shù)據(jù)處理包,把 csv 文件讀入成 dataframe 格式,在 jupyter notebook 中,可以看到我們的數(shù)據(jù)長(zhǎng)什么樣:

我們就可以把它看作一張 excel 表格,共有 12 列,891 行(代表在 train_csv 中共有 891 個(gè)乘客)。Survived 字段代表該乘客是否獲救(1 代表獲救,0 代表沒(méi)有獲救),其余是一些個(gè)人信息

passengerId => 乘客的 ID

Pclass => 乘客所在艙位的等級(jí)(1、2、3 等艙)

Name => 姓名

Sex => 性別

Age => 年齡

SibSp => 兄弟姐妹個(gè)數(shù)

Parch => 父母與小孩個(gè)數(shù)

Ticket => 船票信息

Fare => 票價(jià)

Cabin => 客艙信息

Embarked => 登船所在港口

data_train.info()

這里告訴了我么一些關(guān)于 data_train 的基本信息,比如共有 891 個(gè)乘客,但是有些字段的數(shù)據(jù)不全。比如 Age(年齡)、Cabin(客艙信息)。

data_train.describe()

在這里我們看到了什么信息呢?從 mean 行中約有 0.38 的人最后獲救了,乘客的平均年齡為 29.7 歲,平均票價(jià)為 32.20

數(shù)據(jù)初步分析

每個(gè)乘客大概有 12 種屬性提供給我們,僅僅對(duì)于上面兩行操作對(duì)于數(shù)據(jù)的了解還無(wú)法為我們提供想法和思路,我們現(xiàn)在不知道哪些有用哪些對(duì)于模型沒(méi)有用,所以到了最關(guān)鍵的特征工程環(huán)節(jié)。我們知道最終的 output 是 Suvived,現(xiàn)在需要尋找最后的 Survived 與各個(gè)屬性之間有著什么樣的內(nèi)在關(guān)系。從大副的口中已經(jīng)得知「要首先考慮婦女和兒童」。

for x in data1_x:
 if data1[x].dtype != "float64" :
 print("Survival Correlation by:", x)
 print(data1[[x, Target[0]]].groupby(x, as_index=False).mean())
 print("-"*10, "
")
 
print(pd.crosstab(data1["Title"],data1[Target[0]]))

在本圖中,我們發(fā)現(xiàn)女性有 0.74 活下來(lái),而男性只有 0.18。歪果盆友果然很尊重 lady,lady first 踐行得不錯(cuò)。性別無(wú)疑要作為重要特征加入最后的模型之中。在 Pclass 中,客艙為等級(jí) 1 的乘客獲救的概率高很多,嗯這個(gè)一定也影響最后獲救的結(jié)果(等級(jí)高的乘客一定也更有錢)。

fig = plt.figure()
fig.set(alpha=0.2) 
Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df=pd.DataFrame({"Survived":Survived_1, "unSurvived":Survived_0})
df.plot(kind="bar", stacked=True)
plt.title("Survived status of all passenger classes")
plt.xlabel("passanger"s level") 
plt.ylabel("number") 
plt.show()

從本圖中我們可以看到,明顯如果你是等級(jí)為 1 的乘客,你的獲救概率就會(huì)很高。對(duì)了,這也是會(huì)最終影響輸出的獲救結(jié)果的一個(gè)特征。

data_train.Age[data_train.Pclass == 1].plot(kind="kde") 
data_train.Age[data_train.Pclass == 2].plot(kind="kde")
data_train.Age[data_train.Pclass == 3].plot(kind="kde")
plt.xlabel("age")# plots an axis lable
plt.ylabel("dendity") 
plt.title("Age distribution of passengers levels")
plt.legend(("first level", "second level","third level"),loc="best")

從各等級(jí)乘客的年齡分布中,我們可以看到「不同艙位/乘客等級(jí)可能和財(cái)富/地位有關(guān)系,最后獲救概率可能會(huì)不一樣」,所以年齡也會(huì)是影響我們最終結(jié)果的原因之一。

簡(jiǎn)單數(shù)據(jù)預(yù)處理

我們對(duì)大體數(shù)據(jù)已經(jīng)看過(guò)一遍了,對(duì)于感興趣的屬性也有了大概的了解。現(xiàn)在我們需要 簡(jiǎn)單處理一下這些數(shù)據(jù),為機(jī)器學(xué)習(xí)建模做點(diǎn)準(zhǔn)備了。先從最突出的數(shù)據(jù)屬性開(kāi)始吧,Cabin 和 Age,因?yàn)檫@兩項(xiàng)有些乘客的信息不包含它們,有丟失的數(shù)據(jù)對(duì)于下一步的工作影響太大。

先說(shuō) Cabin,暫時(shí)我們就按照剛才說(shuō)的,按 Cabin 有無(wú)數(shù)據(jù),將這個(gè)屬性處理成 Yes 和 No 兩種類型吧。

再說(shuō) Age:

通常遇到缺值的情況,我們會(huì)有幾種常見(jiàn)的處理方式

如果缺值的樣本占總數(shù)比例極高,我們可能就直接舍棄了,作為特征加入的話,可能反倒帶入 noise,影響最后的結(jié)果了

如果缺值的樣本適中,而該屬性非連續(xù)值特征屬性(比如說(shuō)類目屬性),那就把 NaN 作為一個(gè)新類別,加到類別特征中

如果缺值的樣本適中,而該屬性為連續(xù)值特征屬性,有時(shí)候我們會(huì)考慮給定一個(gè) step(比如這里的 age,我們可以考慮每隔 2/3 歲為一個(gè)步長(zhǎng)),然后把它離散化,之后把 NaN 作為一個(gè) type 加到屬性類目中。

有些情況下,缺失的值個(gè)數(shù)并不是特別多,那我們也可以試著根據(jù)已有的值,擬合一下數(shù)據(jù),補(bǔ)充上。

本例中,因?yàn)?Cabin 不是影響最終結(jié)果的特征之一。所以直接考慮別的需要用到的特征(性別,等級(jí),等級(jí)),并將其中的類目型轉(zhuǎn)化為數(shù)值型特征,我們可以使用 pandas 的“get_dummies”來(lái)完成這個(gè)工作,并接在原來(lái)的“data_train”上

dummies_Embarked = pd.get_dummies(data_train["Embarked"], prefix= "Embarked")
dummies_Sex = pd.get_dummies(data_train["Sex"], prefix= "Sex")
dummies_Pclass = pd.get_dummies(data_train["Pclass"], prefix= "Pclass")

df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
df.drop(["Pclass", "Name", "Sex", "Ticket", "Embarked"], axis=1, inplace=True)
df

na!我們將這些類目屬性成功轉(zhuǎn)化為 0,1 的數(shù)值屬性了。這樣看來(lái),好像差不多都完成了,可是如果再看看 Age 和 Fare 兩個(gè)屬性,乘客關(guān)于這兩個(gè)屬性的數(shù)值變化幅度也太大了?。∪绻蠹伊私膺壿嫽貧w與梯度下降的話,會(huì)知道各屬性之間的 scale 差距太大,將對(duì)收斂速度造成很大的傷害(甚至不收斂)... 所以我們先用 scikit-learn 里面的 preprocessing 模塊對(duì)這兩個(gè)屬性做一個(gè)處理(就是將變化幅度較大的特征化到 [-1,1] 內(nèi))

import sklearn.preprocessing as preprocessing
scaler = preprocessing.StandardScaler()
age_scale_param = scaler.fit(df["Age"])
df["Age_scaled"] = scaler.fit_transform(df["Age"], age_scale_param)
fare_scale_param = scaler.fit(df["Fare"])
df["Fare_scaled"] = scaler.fit_transform(df["Fare"], fare_scale_param)
df

嗯,這樣初級(jí)的數(shù)據(jù)處理就完成的差不多了

建模

我么把需要的 feature 字段提取出來(lái),轉(zhuǎn)成 numpy 格式,使用 scikit-learn 中的 LogisticRegression 建模。

from sklearn import linear_model
# 用正則取出我們要的屬性值
train_df = df.filter(regex="Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*")
train_np = train_df.as_matrix()
# y 即 Survival 結(jié)果
y = train_np[:, 0]
# X 即特征屬性值
X = train_np[:, 1:]
# fit 到 RandomForestRegressor 之中
clf = linear_model.LogisticRegression(C=1.0, penalty="l1", tol=1e-6)
clf.fit(X, y)
clf

OK!??!通過(guò)這樣建模后,我們得到一個(gè) model,然后再把 test.csv 通過(guò)同樣的數(shù)據(jù)簡(jiǎn)單處理后,就可以得到預(yù)測(cè)結(jié)果了。

系統(tǒng)優(yōu)化

等等,你以為這樣就完了么。這其實(shí)只完成了剛剛開(kāi)始的一步,我們只是做了一個(gè) baseline model,一切都還是基礎(chǔ)的,我們還需要優(yōu)化。

不過(guò)在現(xiàn)在的場(chǎng)景下,先不著急做這個(gè)事情,我們這個(gè) baseline 系統(tǒng)還有些粗糙,先再挖掘挖掘。

首先,Name 和 Ticket 兩個(gè)屬性被我們完整舍棄了 (好吧,其實(shí)是因?yàn)檫@倆屬性,幾乎每一條記錄都是一個(gè)完全不同的值,我們并沒(méi)有找到很直接的處理方式)。

然后,我們想想,年齡的擬合本身也未必是一件非常靠譜的事情,我們依據(jù)其余屬性,其實(shí)并不能很好地?cái)M合預(yù)測(cè)出未知的年齡。再一個(gè),以我們的日常經(jīng)驗(yàn),小盆友和老人可能得到的照顧會(huì)多一些,這樣看的話,年齡作為一個(gè)連續(xù)值,給一個(gè)固定的系數(shù),應(yīng)該和年齡是一個(gè)正相關(guān)或者負(fù)相關(guān),似乎體現(xiàn)不出兩頭受照顧的實(shí)際情況,所以,說(shuō)不定我們把年齡離散化,按區(qū)段分作類別屬性會(huì)更合適一些。(大家去 kaggle 上可以看看大神的 kernels)


文 / joeCDC
數(shù)學(xué)愛(ài)好者

編 / 熒聲

本文已由作者授權(quán)發(fā)布,版權(quán)屬于創(chuàng)宇前端。歡迎注明出處轉(zhuǎn)載本文。本文鏈接:https://knownsec-fed.com/2018...

想要訂閱更多來(lái)自知道創(chuàng)宇開(kāi)發(fā)一線的分享,請(qǐng)搜索關(guān)注我們的微信公眾號(hào):創(chuàng)宇前端(KnownsecFED)。歡迎留言討論,我們會(huì)盡可能回復(fù)。

歡迎點(diǎn)贊、收藏、留言評(píng)論、轉(zhuǎn)發(fā)分享和打賞支持我們。打賞將被完全轉(zhuǎn)交給文章作者。

感謝您的閱讀。

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

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

相關(guān)文章

  • 人工智障刷題!Kaggle 入門實(shí)戰(zhàn)泰坦克號(hào)

    showImg(https://segmentfault.com/img/bVbkB4E?w=800&h=400); 背景 關(guān)于 Kaggle https://www.kaggle.com/ 這是一個(gè)為你提供完美數(shù)據(jù),為你提供實(shí)際應(yīng)用場(chǎng)景,可以與小伙伴在數(shù)據(jù)挖掘領(lǐng)域 high 的不要不要的的地方?。。?! Kaggle 是一個(gè)用來(lái)學(xué)習(xí)、分享和競(jìng)賽的線上數(shù)據(jù)實(shí)驗(yàn)平臺(tái),有點(diǎn)類似 KDD—CUP(國(guó)際...

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

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

0條評(píng)論

閱讀需要支付1元查看
<