国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Kaggle入門級競賽top5%排名經(jīng)驗(yàn)分享】— 建模篇

iOS122 / 1982人閱讀

摘要:提取出中的信息特征缺失值同樣,觀察的缺失值情況缺失值處理發(fā)現(xiàn)兩位都是女性。特征缺失值特征有的缺失值,較為嚴(yán)重,如果進(jìn)行大量的填補(bǔ)會引入更多噪聲。因?yàn)槿笔е狄彩且环N值,這里將缺失值視為一種特殊的值來處理,并根據(jù)首個(gè)字符衍生一個(gè)新的特征。

作者:xiaoyu

微信公眾號:Python數(shù)據(jù)科學(xué)

知乎:python數(shù)據(jù)分析師


前情回顧

上一篇是數(shù)據(jù)挖掘的前戲,主要目的是認(rèn)識數(shù)據(jù)特征、判斷特征重要性、觀察數(shù)據(jù)異常,掌握數(shù)據(jù)間聯(lián)系。本篇將繼續(xù)上一篇分析進(jìn)行數(shù)據(jù)挖掘建模部分。

上篇數(shù)據(jù)分析的鏈接:
【Kaggle入門級競賽top5%排名經(jīng)驗(yàn)分享】— 分析篇

數(shù)據(jù)預(yù)處理

數(shù)據(jù)預(yù)處理涉及的內(nèi)容很多,也包括特征工程,是任務(wù)量最大的一部分。為了讓大家更清晰的閱讀,以下先列出處理部分大致要用到的一些方法。

數(shù)據(jù)清洗:缺失值,異常值,一致性;

特征編碼one-hotlabel coding

特征分箱:等頻,等距,聚類等;

衍生變量:可解釋性強(qiáng),適合模型輸入;

特征選擇:方差選擇,卡方選擇,正則化等;

1. 數(shù)據(jù)清洗

分析部分我們看到,存在缺失值的特征有4個(gè):Age,Cabin,Embarked,F(xiàn)are。關(guān)于缺失值處理部分博主之前介紹過一些方法:【Python數(shù)據(jù)分析基礎(chǔ)】: 數(shù)據(jù)缺失值處理

下面開始對缺失值分別處理。

Fare缺失值處理

首先查看一下Fare特征缺失:

df[df["Fare"].isnull()]

發(fā)現(xiàn)只有一個(gè)缺失值,其實(shí)可以直接刪除,但是好多乘客都是以一個(gè)家庭來的,這其中會有很強(qiáng)的聯(lián)系,并會給我們很好的線索,因此選擇不刪除。

繼續(xù)觀察一下這個(gè)缺失值乘客有什么特點(diǎn)?如何利用我們之前的分析來處理?

特點(diǎn)1:Pclass為3,我們在分析部分知道Fare和Pclass社會等級有著緊密的關(guān)系,Pclass1的Fare相對較高,F(xiàn)are最低的是Pclass3;

特點(diǎn)2:該乘客的Age大于60,且為男性;

這時(shí)我們可以使用相似特征替換方法來填補(bǔ)缺失值,下面來找一下與缺失值具有相似特征的其它樣本數(shù)據(jù):

df.loc[(df["Pclass"]==3)&(df["Age"]>60)&(df["Sex"]=="male")]

找到了與之相匹配的幾位其它乘客,我們就用這幾位乘客的Fare平均值來填補(bǔ)。

# 提取出Name中的Surname信息
df["surname"] = df["Name"].apply(lambda x: x.split(",")[0].lower())
fare_mean_estimated = df.loc[(df["Pclass"]==3)&(df["Age"]>60)&(df["Sex"]=="male")].Fare.mean()
df.loc[df["surname"]=="storey","Fare"] = fare_mean_estimated

Embarked特征缺失值

同樣,觀察Embarked的缺失值情況:

# Embarked缺失值處理
df[df["Embarked"].isnull()]

發(fā)現(xiàn)兩位都是女性。上篇可視化分析過,pclass1且為女性的情況下,Q港口幾乎為0,而C港口最多,其次S港口,下圖為分析篇的可視化結(jié)果。


這里采用出現(xiàn)最多的港口,也就是眾數(shù)C港口進(jìn)行填補(bǔ)。

df["Embarked"] = df["Embarked"].fillna("C")

Cabin特征缺失值

Cain特征有70%的缺失值,較為嚴(yán)重,如果進(jìn)行大量的填補(bǔ)會引入更多噪聲。因?yàn)槿笔е狄彩且环N值,這里將Cabin缺失值視為一種特殊的值來處理,并根據(jù)Cabin首個(gè)字符衍生一個(gè)新的特征CabinCat

df["CabinCat"] = pd.Categorical.from_array(df.Cabin.fillna("0").apply(lambda x: x[0])).codes

pandas的 Categorical.from_array()用法。代碼含義是用“0”替換Cabin缺失值,并將非缺失Cabin特征值提取出第一個(gè)值以進(jìn)行分類,比如A114就是A,C345就是C,如下:

[0, C, 0, C, 0, ..., 0, C, 0, 0, 0]
Length: 1309
Categories (9, object): [0, A, B, C, ..., E, F, G, T]

Categorical.from_array()將Cabin分成了9組,最后通過codes量化為數(shù)字,通過可視化觀察一下分組離散化后的結(jié)果:

fig, ax = plt.subplots(figsize=(10,5))
sns.countplot(x="CabinCat", hue="Survived",data=df)
plt.show()

以上可視化看到:Cabin缺失的乘客中,遇難人數(shù)是獲救人數(shù)2倍以上,而其它有Cabin信息的乘客中,獲救人數(shù)都相對較多。因此說明Cabin缺失與否關(guān)系到了生還的概率。

Age特征缺失值

Age有20%缺失值,缺失值較多,大量刪除會減少樣本信息,由于它與Cabin不同,這里將利用其它特征進(jìn)行預(yù)測填補(bǔ)Age,也就是擬合未知Age特征值,會在后續(xù)進(jìn)行處理。

數(shù)據(jù)一致性分析

當(dāng)我們拿到數(shù)據(jù)后,我們要謹(jǐn)記一個(gè)道理:不要完全相信數(shù)據(jù)。即使不是異常值,也有可能是錯(cuò)誤的信息,那就是檢查數(shù)據(jù)的一致性。

本例中,我們通過兩個(gè)錯(cuò)誤的修正來理解一下。

錯(cuò)誤1:SibSp和Parch特征存在不一致

df.loc[df["surname"]=="abbott",["Name","Sex","Age","SibSp","Parch"]]

為了方便閱讀,下面用序號來代替名字。

首先尋找到了船上姓 abbott 的所有人,即一家人。發(fā)現(xiàn):392 乘客只有13歲,確有兩個(gè)孩子Parch=2(理論上不太可能),而279乘客35歲,有一個(gè)孩子,還有一個(gè)兄弟姐妹,746有一個(gè)家長和一個(gè)兄弟姐妹。很明顯,信息是錯(cuò)誤的,279與392乘客的信息寫反了。正確的信息是一位母親帶著兩個(gè)孩子,所以改為:279乘客為SibSp=0,Parh=2,392歲的乘客是:SibSp=1, Parh=1。下面是修改代碼:

df.loc[(df["surname"]=="abbott")&(df["Age"]==35),"SibSp"] = 0
df.loc[(df["surname"]=="abbott")&(df["Age"]==35),"Parch"] = 2
df.loc[(df["surname"]=="abbott")&(df["Age"]==13),"SibSp"] = 1
df.loc[(df["surname"]=="abbott")&(df["Age"]==13),"Parch"] = 1

錯(cuò)誤2:SibSp和Parch特征存在不一致

df.loc[df["surname"]=="ford",["Name","Sex","Age","SibSp","Parch"]]

同理,ford一家人也出現(xiàn)了一致性錯(cuò)誤的問題,具體大家可自行分析。正確的是:一位母親帶著三個(gè)孩子,而最后一位乘客為測試集里的樣本,推測很可能是父親。下面是修改代碼:

df.loc[(df["surname"]=="ford")&(df["Age"]==16),"SibSp"] = 3
df.loc[(df["surname"]=="ford")&(df["Age"]==16),"Parch"] = 1
df.loc[(df["surname"]=="ford")&(df["Age"]==9),"SibSp"] = 3
df.loc[(df["surname"]=="ford")&(df["Age"]==9),"Parch"] = 1
df.loc[(df["surname"]=="ford")&(df["Age"]==21),"SibSp"] = 3
df.loc[(df["surname"]=="ford")&(df["Age"]==21),"Parch"] = 1
df.loc[(df["surname"]=="ford")&(df["Age"]==48),"SibSp"] = 0
df.loc[(df["surname"]=="ford")&(df["Age"]==48),"Parch"] = 4
df.loc[(df["surname"]=="ford")&(df["Age"]==18),"SibSp"] = 3
df.loc[(df["surname"]=="ford")&(df["Age"]==18),"Parch"] = 1
2. 數(shù)據(jù)變換

衍生變量

分析部分沒提及到Name特征,因?yàn)槊總€(gè)人的名字都不一樣。但是一些人可能是群體行動,比如一家人一起,而一家人的surname是一樣的,因此這時(shí)候就可以通過surname找到一個(gè)家庭群體。家庭群體有什么用?我們后面會提到。
實(shí)際上,如果我們深入分析,Name特征是非常重要的。試想一下乘客有沒有可能是和其他人一起上船的?是一家人?情侶?還是獨(dú)自一人?而這一群人生還的概率應(yīng)該是存在共性的,比如:有一個(gè)5人之家,有4人死亡,可以推測第5個(gè)人極有可能死亡。
下面是對所有特征進(jìn)行衍生的新特征變量。

# 從Name中提取Title信息,因?yàn)橥瑸槟行裕琈r.和 Master.的生還率是不一樣的
df["Title"] = df["Name"].apply(lambda x: re.search(" ([A-Za-z]+).",x).group(1))
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Dr": 5, "Rev": 6, "Major": 7, "Col": 7, "Mlle": 2, "Mme": 3,"Don": 9,"Dona": 9, "Lady": 10, "Countess": 10, "Jonkheer": 10, "Sir": 9, "Capt": 7, "Ms": 2}

# 量化Title信息
df["TitleCat"] = df.loc[:,"Title"].map(title_mapping)

# SibSp和Parch特征進(jìn)行組合
df["FamilySize"] = df["SibSp"] + df["Parch"] + 1
# 根據(jù)FamilySize分布進(jìn)行分箱
df["FamilySize"] = pd.cut(df["FamilySize"], bins=[0,1,4,20], labels=[0,1,2])

# 從Name特征衍生出Name的長度
df["NameLength"] = df["Name"].apply(lambda x: len(x))

# 量化Embarked特征
df["Embarked"] = pd.Categorical.from_array(df.Embarked).codes

# 對Sex特征進(jìn)行獨(dú)熱編碼分組
df = pd.concat([df,pd.get_dummies(df["Sex"])],axis=1)

下面衍生特征變量的說明:

Title:從Name中提取Title信息,因?yàn)橥瑸槟行裕琈r.和 Master.的生還率是不一樣的;

TitleCat:映射并量化Title信息,雖然這個(gè)特征可能會與Sex有共線性,但是我們先衍生出來,后進(jìn)行篩選;

FamilySize:可視化分析部分看到SibSp和Parch分布相似,固將SibSp和Parch特征進(jìn)行組合;

NameLength:從Name特征衍生出Name的長度,因?yàn)橛械膰颐衷蕉檀碓斤@貴;

CabinCat:Cabin的分組信息;

高級衍生變量

【1】人物衍生特征

由于兒童的生還率較高,因此將所有乘客兒童多帶帶提取出來(這里設(shè)置為18歲)。而對于成年人女性生還概率比較高,所以又非為成年女性和成年男性。代碼如下:

# 婦女/兒童 男士標(biāo)簽
child_age = 18
def get_person(passenger):
    age, sex = passenger
    if (age < child_age):
        return "child"
    elif (sex == "female"):
        return "female_adult"
    else:
        return "male_adult"

df = pd.concat([df, pd.DataFrame(df[["Age", "Sex"]].apply(get_person, axis=1), columns=["person"])],axis=1)
df = pd.concat([df,pd.get_dummies(df["person"])],axis=1)

【2】Ticket衍生特征

下面基于Ticket衍生出了幾個(gè)高級特征變量,其含義:如果幾個(gè)人擁有相同的Ticket號碼,那么意味著他門是一個(gè)小群體(一家人或情侶等),而又因?yàn)槟行耘赃€概率本省存在差異,因此將分別衍生出幾個(gè)人物標(biāo)簽特征,即分群體情況下的男女生還特征。以下是代碼實(shí)現(xiàn):

table_ticket = pd.DataFrame(df["Ticket"].value_counts())
table_ticket.rename(columns={"Ticket":"Ticket_Numbers"}, inplace=True)
table_ticket["Ticket_dead_women"] = df.Ticket[(df.female_adult == 1.0) 
                                    & (df.Survived == 0.0) 
                                    & ((df.Parch > 0) | (df.SibSp > 0))].value_counts()

table_ticket["Ticket_dead_women"] = table_ticket["Ticket_dead_women"].fillna(0)
table_ticket["Ticket_dead_women"][table_ticket["Ticket_dead_women"] > 0] = 1.0

table_ticket["Ticket_surviving_men"] = df.Ticket[(df.male_adult == 1.0) 
                                    & (df.Survived == 1.0) 
                                    & ((df.Parch > 0) | (df.SibSp > 0))].value_counts()

table_ticket["Ticket_surviving_men"] = table_ticket["Ticket_surviving_men"].fillna(0)
table_ticket["Ticket_surviving_men"][table_ticket["Ticket_surviving_men"] > 0] = 1.0 

# Ticket特征量化
table_ticket["Ticket_Id"] = pd.Categorical.from_array(table_ticket.index).codes

table_ticket["Ticket_Id"][table_ticket["Ticket_Numbers"] < 3 ] = -1
# Ticket數(shù)量分箱
table_ticket["Ticket_Numbers"] = pd.cut(table_ticket["Ticket_Numbers"], bins=[0,1,4,20], labels=[0,1,2])

df = pd.merge(df, table_ticket, left_on="Ticket",right_index=True, how="left", sort=False)

同理,基于衍生變量Surname也可以衍生出高級特征變量,以及Cabin的奇偶性衍生特征

Age缺失值處理

前面說了將采用擬合的方法來填補(bǔ)Age缺失值,那為什么一定要在后面處理呢?
原因如下:

其它特征還存在缺失值,放入擬合模型影響預(yù)測效果;

特征保持原生符號,還沒有進(jìn)行量化,無法輸入模型;

因?yàn)樯厦嬉呀?jīng)將所提問題解決,因此可以開始擬合Age缺失值。這部分使用了隨機(jī)森林的ExtraTreesRegressor模型進(jìn)行擬合,代碼如下:

from sklearn.ensemble import RandomForestClassifier, ExtraTreesRegressor

classers = ["Fare","Parch","Pclass","SibSp","TitleCat", 
            "CabinCat","female","male", "Embarked", "FamilySize", "NameLength","Ticket_Numbers","Ticket_Id"]
etr = ExtraTreesRegressor(n_estimators=200,random_state=0)
X_train = df[classers][df["Age"].notnull()]
Y_train = df["Age"][df["Age"].notnull()]
X_test = df[classers][df["Age"].isnull()]

etr.fit(X_train.as_matrix(),np.ravel(Y_train))
age_preds = etr.predict(X_test.as_matrix())
df["Age"][df["Age"].isnull()] = age_preds

想繼續(xù)看一下擬合的結(jié)果是怎么樣,可以通過可視化來觀察:

# Age缺失值填補(bǔ)后的情況
X_test["Age"] = pd.Series(age_preds)
f,ax=plt.subplots(figsize=(10,5))
sns.swarmplot(x="Pclass",y="Age",data=X_test)
plt.show()


觀察:通過擬合得到的Age缺失值的可視化展示,總體上看效果還可以,具體需要進(jìn)一步排查。

3. 特征選擇

過濾法—方差分析

這里特征采用 ANOVA方差分析的 F值 來對各個(gè)特征變量打分,打分的意義是:各個(gè)特征變量對目標(biāo)變量的影響權(quán)重。代碼如下,使用了sklearn的feature_selection

from sklearn.feature_selection import SelectKBest, f_classif,chi2

target = data_train["Survived"].values
features= ["female","male","Age","male_adult","female_adult", "child","TitleCat",
           "Pclass","Ticket_Id","NameLength","CabinType","CabinCat", "SibSp", "Parch",
           "Fare","Embarked","Surname_Numbers","Ticket_Numbers","FamilySize",
           "Ticket_dead_women","Ticket_surviving_men",
           "Surname_dead_women","Surname_surviving_men"]

train = df[0:891].copy()
test = df[891:].copy()

selector = SelectKBest(f_classif, k=len(features))
selector.fit(train[features], target)
scores = -np.log10(selector.pvalues_)
indices = np.argsort(scores)[::-1]
print("Features importance :")
for f in range(len(scores)):
    print("%0.2f %s" % (scores[indices[f]],features[indices[f]]))

此部分將之前訓(xùn)練和測試合并的數(shù)據(jù)集分開,因?yàn)樽詈笪覀円獙y試集進(jìn)行預(yù)測。特征選擇權(quán)重結(jié)果如下(可以通過可視化的方法展示出來):

這里分?jǐn)?shù)越高代表特征權(quán)重越大,當(dāng)然我們可以規(guī)定相應(yīng)的閾值來選擇權(quán)重大的特征。

特征相關(guān)性分析

除了對特征權(quán)重選擇外,我們也要分析特征相關(guān)性來篩選特征。相關(guān)性大的特征容易造成過擬合現(xiàn)象,因此需要進(jìn)行剔除。最好的情況就是:所有特征相關(guān)性很低,各自的方差或者說信息量很高。
使用了seaborn的heatmap展示相關(guān)性,代碼如下:

features_selected = features
# data_corr 
df_corr = df[features_selected].copy()

colormap = plt.cm.RdBu
plt.figure(figsize=(20,20))
sns.heatmap(df_corr.corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor="white", annot=True)
plt.show()

3 建模預(yù)測 創(chuàng)建模型

這是個(gè)明顯的監(jiān)督分類問題,因此可選擇的模型算法很多,或者模型融合等來提高準(zhǔn)確度。這里采用了集成學(xué)習(xí)的隨機(jī)森林RandomForest模型。代碼如下:

from sklearn import cross_validation

rfc = RandomForestClassifier(n_estimators=3000, min_samples_split=4, class_weight={0:0.745,1:0.255})
# rfc = AdaBoostClassifier(n_estimators=3000, learning_rate=0.1, random_state=1)

# 交叉驗(yàn)證,建模隨機(jī)森林
kf = cross_validation.KFold(train.shape[0], n_folds=3, random_state=1)

scores = cross_validation.cross_val_score(rfc, train[features_selected], target, cv=kf)
print("Accuracy: %0.3f (+/- %0.2f) [%s]" % (scores.mean()*100, scores.std()*100, "RFC Cross Validation"))
rfc.fit(train[features_selected], target)
score = rfc.score(train[features_selected], target)
print("Accuracy: %0.3f            [%s]" % (score*100, "RFC full test"))
importances = rfc.feature_importances_
indices = np.argsort(importances)[::-1]
for f in range(len(features_selected)):
    print("%d. feature %d (%f) %s" % (f + 1, indices[f]+1, importances[indices[f]]*100, features_selected[indices[f]]))

為防止過擬合,采用了K折交叉驗(yàn)證進(jìn)行采樣。集成學(xué)習(xí)等高級模型有自帶的特征打分方法,訓(xùn)練數(shù)據(jù)后,我們可以通過feature_importances得到特征權(quán)重分?jǐn)?shù)(當(dāng)特征特別多時(shí),也可以作為初始的特征篩選方法)。當(dāng)然這也可以通過可視化的方法展示出來。

輸入結(jié)果如下:

模型預(yù)測
# 預(yù)測目標(biāo)值
rfc.fit(train[features_selected], target)
predictions = rfc.predict(test[features_selected])
輸出文件
# 輸出文件
PassengerId =np.array(test["PassengerId"]).astype(int)
my_prediction = pd.DataFrame(predictions, PassengerId, columns = ["Survived"])

my_prediction.to_csv("my_prediction.csv", index_label = ["PassengerId"])

最后,將預(yù)測結(jié)果輸出到excel表中。如果你到Kaggle將輸出的數(shù)據(jù)提交,你應(yīng)該得到的分?jǐn)?shù)是:0.8188,也就是說你的準(zhǔn)確率是0.8188。這個(gè)分?jǐn)?shù)可以達(dá)到500/11000的排名(top5%)。

4 總結(jié)

本篇分析了數(shù)據(jù)預(yù)處理以及建模的部分,完成了最后的生還者預(yù)測,有幾下幾點(diǎn)還需要提高的地方:

尋找更多衍生特征,提高模型輸入質(zhì)量;

嘗試多種模型,對比預(yù)測結(jié)果,或者可以使用高級模型融合,以及stacking二次融合優(yōu)化來提高準(zhǔn)確率;

嘗試多種方法在眾多特征中篩選重要特征;

對于一些模糊異常值進(jìn)一步檢測和處理;

提高填補(bǔ)缺失值的準(zhǔn)確度,減少數(shù)據(jù)中的噪音;

以上就是本次項(xiàng)目的全部內(nèi)容,后續(xù)會繼續(xù)分享新數(shù)據(jù)分析挖掘項(xiàng)目,敬請期待。

參考:https://www.kaggle.com/franck...

關(guān)注微信公眾號:Python數(shù)據(jù)科學(xué),發(fā)現(xiàn)更多精彩內(nèi)容。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42090.html

相關(guān)文章

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

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

    bergwhite 評論0 收藏0
  • 人工智障也刷題!Kaggle 入門之實(shí)戰(zhàn)泰坦尼克號

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

    caoym 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<