kaggle比賽泰坦尼克號優秀項目翻譯
本片文章是對kaggle關於泰坦尼克號比賽里一個優秀項目分享的一片翻譯。
(我的翻譯很爛,很多是使用google進行的翻譯,希望這篇文章對你有用)
原文鏈接:
https://www.kaggle.com/startupsci/titanic-data-science-solutions?scriptVersionId=2031417Titanic Data Science SolutionsTitanic Data Science Solutions泰坦尼克生存預測
項目流程
這個競賽的解決方案分七步:
- 1.問題的定義
- 2.獲取訓練集和測試集
- 3.準備數據和清洗數據
- 4.分析、識別並探索數據
- 5.建立模型去預測並解決問題
- 6.數據可視化並提出問題解決步驟和最終解決方案
- 7.提交結果
工作流程是指工作事項的活動流向順序。但是也有例外的用例。
- 我們有時會將幾個流程組合在一起,可能會同過可視化分析數據。
- 提前完成一個流程,在清洗數據前後我們都會分析數據。
- 在工作中會多次執行一個流程,多次使用可視化。
- 放棄一個步驟,在本次競賽中可能不需要某些步驟。
問題的定義
想kaggle這樣的競賽網站可以定義要解決的問題或提出問題,同時提供用於同於訓練模型的數據集。在kaggle中泰坦尼克號生還率的競賽做了描述:https://www.kaggle.com/c/titanic
列出泰坦尼克號災難中倖存或未存活的乘客的樣本訓練集可知,如果測試數據集中的這些乘客存活與否,我們的模型是否可以在給定的測試數據集來確定,而測試數據集不包含存活信息。
這下面是kaggle比賽頁面描述的幾點要點。
- 在1912年4月15日是它的初次航行,泰坦尼克號撞上冰山後沉沒,在2224名乘客和機組人員有1502名喪生,存活率僅為32%。
- 這其中最主要的原因就是,沒有足夠的救生艙以供使用。
- 儘管在沉船過程中有運氣的成分存在,像孩子、女人和上層人士的存活率比其他人高。
工作流程的目標
數據科學的工作流程主要有這七個目標。
分類:把我們的例子進行分類,我們要了解不同類與我們要解決的問題的相關性。
相關性:可以根據訓練集的可用特徵來處理這個問題,訓練集內的那些特徵對我們要解決的問題是重要的?從統計學的角度來說,一個特徵與要解決的問題有哪些關聯?一個特徵值改變了那解決方案也會變嗎?這個可以再給定的數據集中的數字特徵和種類特徵進行測試。我們也會去判斷除生存特徵之外的特徵之間的相關性。某些特徵之間的相關性會幫助我們創造、完成或修正特徵。
轉化:在建模階段,需要準備數據。對於我們選擇的演算法可能需要我們將所有的數據都轉化為數字特徵。例如將文本特徵值轉化為數字特徵值。
填充:數據準備階段也需要我們來填充特徵的缺失值,在沒有缺失值時模型演算法結果會更準確。
校正:在給定的訓練集中有一些是錯誤的特徵值,我們要嘗試將這些值找出來修正他們或將他們排除在外。一種方法是檢測樣本的異常值。如果這個特徵對我們的分析或結果不產生影響,我們可以丟棄這個特徵。
創造:基於已經存在的一個或多個特徵創造一個新的特徵,這樣新的特徵就會有相關性和完整性。
製圖:在給定的數據和需要解決的問題中怎樣選擇正確的可視化圖形。
#數據分析和整理import pandas as pdimport numpy as npimport random as rnd#可視化import seaborn as snsimport matplotlib.pyplot as plt%matplotlib inline#機器學習from sklearn.linear_model import LogisticRegressionfrom sklearn.svm import SVC, LinearSVCfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.linear_model import Perceptronfrom sklearn.linear_model import SGDClassifierfrom sklearn.tree import DecisionTreeClassifier
獲取數據
python的pandas包能幫助我們獲取數據,我們將數據集放入pandas的DataFrame中。並將兩個數據集組合到一起,一起來執行某些操作。
train_df = pd.read_csv(C:/Users/Administrator/data/train.csv)test_df = pd.read_csv(C:/Users/Administrator/data/test.csv)combine = [train_df,test_df]
分析數據
在項目早期,pandas通過描述幫助我們解決以下幾個問題。
在數據中有那些特徵?
直接操作或分析這些特性的特性名稱,這些特徵名在kaggle頁面有描述。https://www.kaggle.com/c/titanic/data
print(train_df.columns.values)
哪些是類別特徵?
這些值將樣本分為幾組相似的樣本。類別特徵中的值是名義值,序數值,比值還是區間值?除此之外,這還有助於我們選擇合適的圖表進行可視化。
- 類別值:Survived,Sex and Embarked
- 序數值:Pclass
哪些是數字特徵?
哪些是數字特徵?這些值隨著樣本的不同而不同。數值特徵有連續的,離散的,還有以時間序列為基礎的。除此之外,這還有助於我們選擇合適的圖表進行可視化。
- 連續值:Age,Fare.
- 離散值:SibSp,Parch.
train_df.head()
哪些特徵是混合數字類型?
一些特徵是數字或alpha數字數據。
- Ticket是一種數字和alpha數字的混合數據類型。
- Cabin是alpha數字數據類型。
哪些特徵可能會包含錯誤或拼寫錯誤?
在一個很大的數據集中我們很難檢查錯誤,可是如果我們只檢查幾個簡單的數據集可能會告訴我們哪些特徵需要校正。
- 名稱功能可能包含錯誤或拼寫錯誤,因為有多種方式可用於描述名稱,包括標題,圓括弧以及用於替代或短名稱的引號。
train_df.tail()
哪些特徵包含空白值?
這些空白值是需要修正的。
- Cabin>Age>Embarked 這些特徵在訓練集上包含著一些空值。
- Cabin>Age 在測試數據集上也是不完全的。
各種特徵都是什麼數據類型?
這個信息在轉換目標時會幫助我們。
- 七個特徵是整數或浮點值,在數據集上是六個。
- 五個是字元串。
train_df.info()print(-*40)test_df.info()
在整個樣本中,數字特徵值是怎樣分布的?
這有助於我們確定在其他早期見解中,代表實際問題領域的訓練數據集的代表性。
- 樣本數是891,是真實數據(2224)的40%。
- Survived是一個類別特徵,特徵值是0或1。
- 訓練集的生還率是38%,真實生還率為32%、
- 大約有75%的乘客是沒有父母或孩子。
- 大約有30%的乘客室友兄弟姐妹或配偶的。
- 僅有1%的乘客的票價是高於512的。
- 僅有1%的乘客的年齡是在65-80之間的。
train_df.describe()
類別特徵值是怎樣分布的?
- Name在特種值中是獨一無二的。
- Sex只有兩個可能值。65%是男性。
- Cabin在樣本中有一些是重複的,有一些乘客共用同一個小木屋。
- Embarked有三個可能值,S上車點是乘客最多的地點。
- Ticket特徵有高重複率為22%.(有681個票價是唯一的)
train_df.describe(include = [O])
對分析的數據進行假設
根據數據分析,我們得出了以下假設。在採取適當行動之前,我們可以進一步驗證這些假設。
相關性
我們想知道每一個特徵與Survived的相關性。我們要在項目的早期就做到這一點,並在項目後期將它與模型化關聯進行匹配。
補全
- 1.我們要補全Age特徵,因為它與是否生還息息相關。
- 2.我們也要補全Embarked特徵,因為它也可能與Survived或其他重要特徵有關。
校正
- 1.票價特徵可能會被刪除,因為他有22%的值是相同的,並且這很有可能與survived沒有什麼關係。
- 2.Cabin特徵也可能會被刪除,因為他在訓練集和測試集中有很多空值。
- 3.PassenerId也應該從訓練集中刪除,因為它與Survived沒什麼關係。
- 4.Name特徵是很不標準的,它可能與Survivied沒什麼關係,所以可能被刪除。
創造
- 1.我們現在要創造一個新的特徵,Family,它是基於SibSp和Parch得到的關於家庭人數的總和。
- 2.我們想要從Name特徵中提出一些與要求有關的內容來作為新的特徵。
- 3.我們把年齡分層來創建一個新的特徵,這會將連續的數字特徵變為有序的數字特徵。
- 4.如果把票價分層能對我們分析數據有益處,那就以它來創建一個新的特徵。
分類
我們還可以根據前面的問題描述添加我們的假設。
- 1.女人的生還率可能會更高。
- 2.孩子的生還率可能會更高
- 3.上冊人士的生還率可能會更高。
通過列表來進行分析
為了確認一些觀點和假設,我們快速的分析一些特徵之間的相關性。在這個階段,我們只能在沒有空值的特徵上進行。這樣做只對類別特徵類型、序列特徵類型、離散特徵類型有作用。
- Pclass 我們能看到它與Survived的相關性很大(>0.5),我們決定在我們的模型中保留這個特徵。
- Sex 我們能看到女性的生存率達到了74%。
- SibSp和Parch 這個特徵沒有相關性,最好來創建一個特徵或者一組特徵。
train_df[[Pclass,Survived]].groupby([Pclass],as_index=False).mean().sort_values(by = Survived,ascending = False)train_df[[Sex,Survived]].groupby([Sex],as_index = False).mean().sort_values(by = Survived,ascending = False)train_df[[SibSp,Survived]].groupby([SibSp],as_index = False).mean().sort_values(by = Survived,ascending = False)train_df[[Parch,Survived]].groupby([Parch],as_index = False).mean().sort_values(by = Survived,ascending = False)
通過可視化來分析數據
現在我們使用可視化數據繼續確認我們的假設。
數字特徵的相關性
可視化會讓我們理解連續數字特徵與Survived之間的關聯性。
對於像年齡這樣的連續性數字特徵使用直方圖是很有效的,這有助於我們隊數值進行分層。這個直方圖也能自動的對例子進行區分。這對我們分析數據是非常有幫助的。
注意:在直方圖中x軸代表了乘客的數量。
觀察結果
- 年齡<4的生魂率非常高。
- 年齡最大(80歲)的乘客活了下來。
- 在15-25歲之間的有很多人沒有活下來。
- 大部分乘客都是在15-35歲之間。
決定
這個簡單的分析確定了我們之前的假設。
- 我們會把年齡放在我們的訓練模型中(我們在分類中的 #2)
- 在Age特徵的空值填上特徵(填充 #1)
- 我們應該給年齡分層(創造 #3)
g = sns.FacetGrid(train_df,col = Survived)g.map(plt.hist,Age,bins = 20)
數值特徵與序列特徵之間的相關性
我們能使用一個圖標來表達多個特徵之間的相關性,因為數字特徵和類別特徵都是數值所以才可以這樣用。
觀察結果
- Pclass = 3有很多乘客,但他們大多數都沒有活下來。這就代表我們的分類假設 #2 是正確的。
- 在Pclass = 2與Pclass = 3的很多嬰兒都活了下來,這進一步驗證了分類假設 #2。
- 大部分Pclass = 1的乘客都活了下來。這就代表我們的分類假設 #3 是正確的。
- 在乘客的年齡分層方面Pclass個不相同。
決定
- Pclass作為我們的訓練模型。
grid = sns.FacetGrid(train_df,col = Survived,row = Pclass,size = 2.2,aspect = 1.6)grid.map(plt.hist,Age,alpha = 0.5,bins = 20)grid.add_legend()
類別特徵的相關性
現在我們要驗證類別特徵之間的相關性。
觀察結果
- 女性乘客的存活率高於男性。驗證了分類 #1
- 除了Embarked = C男性的生還率特別高之外,這可能是Pclass和Embarked之間的相關性,而不是Pclass和Survived之間的直接相關性。
- 在C和Q港口上船的男性,Pclass = 3 比Pclass = 2的生還率還要高。(完成 #2)
決定
- 在訓練模型中添加Sex特徵。
- 在訓練模型中添加並完成Embarked特徵。
grid = sns.FacetGrid(train_df,row = Embarked,size = 2.2,aspect = 1.6)grid.map(sns.pointplot,Pclass,Survived,Sex,palette = deep)grid.add_legend()
類別特徵與數字特徵之間的相關性
我們也想關聯類別特徵和數字特徵。我們現在關聯Embarked(無數字類別),Sex(無數字類別),Fare(連續型數值)與Survived之間的關聯。
觀察結果
- 票價越高生存率也就越高。
- 上車地點也與生存率有關。
決定
- 將Fare特徵進行分層。
grid = sns.FacetGrid(train_df,row = Embarked, col = Survived, size = 2.2,aspect = 1.6)grid.map(sns.barplot,Sex,Fare, alpha = 0.5,ci = None)grid.add_legend()
整理特徵
我們已經收集了關於我們的數據集和解決方案需求的幾個假設和決定。到目前為止我我們不能改變單一的特徵或者值。現在要根據我們的假設和決定來進行創造和填充特徵。
刪除無用的特徵
這是一個很好的開始執行目標,刪除無用特徵會讓我們處理的數據點更少,加快我們的運行並簡化分析。
基於我們的假設和判斷我們現在要刪除Cabin和Ticket兩個特徵。
在適用的情況下,我們一起對訓練和測試數據集執行操作,以保持一致。
print(Before,train_df.shape,test_df.shape,combine[0].shape,combine[1].shape)train_df = train_df.drop([Ticket, Cabin], axis=1)test_df = test_df.drop([Ticket, Cabin], axis=1)combine = [train_df,test_df]After ,train_df.shape,test_df.shape,combine[0].shape,combine[1].shape
在現有的基礎上創造新的特徵
我們想要分析Name是否可以提取測試和生存之間的關聯,然後再刪除Name和PassengerId功能。
在下面的代碼中我們使用正則表達式提取特徵。
觀察結果
把Title,Age,和Survived用圖標展示出來,能得到以下觀察結果。
- 大多數頭銜都是準確地描述年齡的,例如:Master頭銜的平均年齡為5歲。
- 各個頭銜之間的生存率略有不同。
- 某些頭銜的人大部分都活了下來,有一些沒有。
決定
- 我們決定保留Tittle特徵在訓練模型中。
for dataset in combine: dataset[Title] = dataset.Name.str.extract( ([A-Za-z]+)., expand=False)pd.crosstab(train_df[Title], train_df[Sex])
我們可以用一個更常見的名稱替換許多標題或者將它們分類為Rare。
for dataset in combine: dataset[Title] = dataset[Title].replace([Lady, Countess,Capt, Col, Don, Dr, Major, Rev, Sir, Jonkheer, Dona], Rare) dataset[Title] = dataset[Title].replace(Mlle, Miss) dataset[Title] = dataset[Title].replace(Ms, Miss) dataset[Title] = dataset[Title].replace(Mme, Mrs)train_df[[Title, Survived]].groupby([Title], as_index=False).mean()
我們可以把類別頭銜轉化為序列特徵。
title_maping = {"Mr":1,"Miss":2,"Mrs":3,"master":4,"Rare":5}for dataset in combine: dataset[Title] = dataset[Title].map(title_maping) dataset[Title] = dataset[Title].fillna(0)train_df.head()
現在我們能在訓練集和測試集上安全的刪除Name特徵。在訓練集上我們也不需要PassengerId特徵。
train_df = train_df.drop([Name, PassengerId], axis=1)test_df = test_df.drop([Name], axis=1)combine = [train_df, test_df]train_df.shape, test_df.shape
轉換類別特徵
現在我們可以把特徵從字元串轉換為數值特徵,因為大部分的模型演算法都是需要數值特徵。
我們先把Sex特徵(female = 1,male = 0)轉化為新的Gender特徵。
for dataset in combine: dataset[Sex] = dataset[Sex].map({"female":1,"male":0}).astype(int)train_df.head()
填充連續型數值特徵
現在我們應該對缺失值或空白值進行評估和填充。我們首先對Age特徵動手。
我們這有三個方法來填充連續型特徵。
- 1.一個簡答的方法是在平均值的標準差上下進行隨機選擇。
- 2.猜測缺失值的更準確的方法是使用其他相關特徵。在我們的案例中,我們注意到年齡,性別和Pclass之間的相關性。使用Pclass和Gender特徵組合中Age的中位數值猜測年齡值。因此,Pclass = 1和Gender = 0的中位數年齡,Pclass = 1和Gender = 1等等
- 3.結合方法1與方法2.
方法1和3會引入隨機雜訊,每次執行獲得的結果可能都不相同。所以我們選擇方法2.
grid = sns.FacetGrid(train_df,row =Pclass,col = Sex,size = 2.2,aspect = 1.6)grid.map(plt.hist,Age,alpha = .5,bins = 20)grid.add_legend()
準備一個空數組,以包含基於Pclass和Gender組合的猜測年齡值。
guess_ages = np.zeros((2,3))guess_ages
現在我們遍歷Sex(0或1)和Pclass(1,2,3)來計算6種組合的Age的猜測值。
for dataset in combine: for i in range(0,2): for j in range(0,3): guess_df = dataset[(dataset[Sex] == i)& (dataset[Pclass] ==j+1)][Age].dropna() age_guess = guess_df.median() guess_ages[i,j] = int(age_guess/0.5+0.5)*0.5 for i in range(0,2): for j in range(0,3): dataset.loc[(dataset.Age.isnull())&(dataset.Sex == i)&(dataset.Pclass == j+1), Age] = guess_ages[i,j] dataset[Age] = dataset[Age].astype(int)train_df.head()
現在我們對年齡進行分層,並確定他們與Survived之間的相關性。
train_df[AgeBand] = pd.cut(train_df[Age],5)train_df[[AgeBand,Survived]].groupby([AgeBand],as_index=False).mean().sort_values(by=AgeBand,ascending=True)
將年齡的取值範圍轉換為序數值。
for dataset in combine: dataset.loc[ dataset[Age] <= 16, Age] = 0 dataset.loc[(dataset[Age] > 16) & (dataset[Age] <= 32), Age] = 1 dataset.loc[(dataset[Age] > 32) & (dataset[Age] <= 48), Age] = 2 dataset.loc[(dataset[Age] > 48) & (dataset[Age] <= 64), Age] = 3 dataset.loc[ dataset[Age] > 64, Age]train_df.head()
我們不用移除AgeBand特徵。
train_df = train_df.drop([AgeBand], axis=1)combine = [train_df, test_df]train_df.head()
從現有的特徵來創造新的特徵
我們現在創在一個新的特徵FamilySize基於Parch和SibSp。這會讓我們把Parch和SibSp從我們的數據集上刪除。
for dataset in combine: dataset[FamilySize] = dataset[SibSp]+dataset[Parch]+1train_df[[FamilySize,Survived]].groupby([FamilySize],as_index=False).mean().sort_values(by=Survived,ascending=False)
我們創造另一個特徵IsAlone。
for dataset in combine: dataset[IsAlone] = 0 dataset.loc[dataset[FamilySize] == 1 , IsAlone] = 1train_df[[IsAlone, Survived]].groupby([IsAlone], as_index=False).mean()
刪除Parch,SibSp和FamilySize特徵。
train_df = train_df.drop([Parch, SibSp, FamilySize], axis=1)test_df = test_df.drop([Parch, SibSp, FamilySize], axis=1)combine = [train_df, test_df]train_df.head()
我們現在創造一個人工特徵將Pclass和Age結合起來。
for dataset in combine: dataset[Age*Class] = dataset.Age * dataset.Pclasstrain_df.loc[:, [Age*Class, Age, Pclass]].head(10)
填充類別特徵
Embarked特徵有S,Q,C三個值。我們的訓練集有兩個缺失值,所以我們填充兩個最常見的特徵值。
freq_port = train_df.Embarked.dropna().mode()[0]freq_portfor dataset in combine: dataset[Embarked] = dataset[Embarked].fillna(freq_port)train_df[[Embarked, Survived]].groupby([Embarked], as_index=False).mean().sort_values(by=Survived, ascending=False)
將類別特徵轉換為數值特徵
想在將Embaredde字元串特徵轉化為數值特徵。
for dataset in combine: dataset[Embarked] = dataset[Embarked].map({S:0,C:1,Q:2}).astype(int)train_df.head()
快速填充和轉化數值特徵
我們現在可以在測試集上選擇最常出現的值作為單個缺失值填充Fare特,我們在一行代碼中執行此操作。
test_df[Fare].fillna(test_df[Fare].dropna().median(), inplace=True)test_df.head()
創造一個新的FareBand特徵
train_df[FareBand] = pd.qcut(train_df[Fare],4)train_df[[FareBand, Survived]].groupby([FareBand], as_index=False).mean().sort_values(by=FareBand, ascending=True)
將Fare特徵轉換為序列值特徵。
for dataset in combine: dataset.loc[ dataset[Fare] <= 7.91, Fare] = 0 dataset.loc[(dataset[Fare] > 7.91) & (dataset[Fare] <= 14.454), Fare] = 1 dataset.loc[(dataset[Fare] > 14.454) & (dataset[Fare] <= 31), Fare] = 2 dataset.loc[ dataset[Fare] > 31, Fare] = 3 dataset[Fare] = dataset[Fare].astype(int)train_df = train_df.drop([FareBand], axis=1)combine = [train_df, test_df]train_df.head(10)test_df.head(10)
模型、預測和解決問題
現在我們準備好訓練模型和預測所需的解決方案。有60多種建模演算法可供選擇。我們必須了解問題類型和解決方案要求,以便縮小到我們可以評估的少數幾個模型。我們的問題是分類和回歸問題。我們希望確定輸出(生存與否)與其他變數或功能(性別,年齡,埠...)之間的關係。我們也正在執行一類機器學習,因為我們正在使用給定的數據集來訓練我們的模型,所以稱為監督學習。有了這兩個標準 - 監督學習是回歸,我們可以將我們的模型選擇縮小到幾個。這些包括:
- Logistic Regression
- KNN or k-Nearest Neighbors
- Support Vector Machines
- Naive Bayes classifier
- Decision Tree
- Random Forrest
- Perceptron
- Artificial neural network
- RVM or Relevance Vector Machine
x_train = train_df.drop("Survived",axis =1 )y_train = train_df[Survived]x_test = test_df.drop(PassengerId,axis = 1).copy()x_train.shape,y_train.shape,x_test.shape
Logistic Regression在我們的工作早期運行是非常有必要的。邏輯回歸通過使用邏輯函數估計概率來測量分類因變數(特徵)和一個或多個自變數(特徵)之間的關係,該邏輯函數是累積邏輯分布。 參考維基百科。
請注意我們訓練數據集生成的預測結果、
logreg = LogisticRegression()logreg.fit(x_train,y_train)y_pred = logreg.predict(x_test)acc_log = round(logreg.score(x_train,y_train)*100,2)acc_log
我們可以使用Logistic回歸來驗證我們對功能創建和完成目標的假設和決策。 這可以通過計算決策函數中的特徵的係數來完成。
正係數增加了響應的對數幾率(從而增加了概率),負係數降低了響應的對數幾率(從而降低了概率)。
- 性別是最高的正係數,意味著性別對(男性:0到女性:1)生存率= 1的概率增加最多。
- 相反Pclass升高與Survived = 1的增加的最大。
- 這樣Age * Class是一個很好的人造模型,因為它與Survived具有次高的負相關性。
- 標題也是第二高的正相關。
coff_df = pd.DataFrame(train_df.columns.delete(0))coff_df.columns=[Feature]coff_df[Correlation]= pd.Series(logreg.coef_[0])coff_df.sort_values(by=Correlation, ascending=False)
接下來,我們使用支持向量機進行建模,支持向量機是具有關聯學習演算法的監督學習模型,學習演算法分析用於分類和回歸分析的數據。給定一組訓練樣本,每組標記為屬於兩個類別中的一個或另一個,SVM訓練演算法建立一個模型,將新的測試樣本分配給一個類別或另一個類別,從而使其成為非概率二元線性分類器。 參考維基百科。
請注意,該模型生成的分數高於邏輯回歸模型。
svc = SVC()svc.fit(x_train,y_train)Y_pred = svc.predict(x_test)acc_svc=round(svc.score(x_train,y_train)*100,2)acc_svc
在模式識別中,k-最近鄰居演算法(簡稱k-NN)是一種用於分類和回歸的非參數方法。 一個樣本通過相鄰的多數投票進行分類,樣本被分配到k個最近鄰中最常見的類別(k是一個正整數,通常很小)。 如果k = 1,則將該對象簡單地分配給該單個最近的類別。 參考維基百科。
KNN置信度比邏輯回歸和SVM好。
knn = KNeighborsClassifier(n_neighbors=5)knn.fit(x_train,y_train)Y_pred= knn.predict(x_test)acc_knn=round(knn.score(x_train,y_train)*100,2)acc_knn
在機器學習中,樸素貝葉斯分類器是一個簡單的概率分類器,它基於貝葉斯定理和特徵之間的獨立性假設。樸素貝葉斯分類器具有高度可擴展性,在學習問題中需要許多變數(特徵)的線性參數。 參考維基百科。
模型生成的置信度是目前評估的模型中最低的。
gaussian = GaussianNB()gaussian.fit(x_train, y_train)Y_pred = gaussian.predict(x_test)acc_gaussian = round(gaussian.score(x_train, y_train) * 100, 2)acc_gaussian
感知器是用於二元分類器的監督學習的演算法(可以決定輸入由數字向量表示的屬於某個特定類別的函數)。 它是一種線性分類器,即一種分類演算法,它基於將一組權重與特徵向量相結合的線性預測函數進行預測。 該演算法允許在線學習,因為它一次處理訓練集中的元素。 參考維基百科。
perceptron = Perceptron()perceptron.fit(x_train, y_train)Y_pred = perceptron.predict(x_test)acc_perceptron = round(perceptron.score(x_train, y_train) * 100, 2)acc_perceptronlinear_svc = LinearSVC()linear_svc.fit(x_train, y_train)Y_pred = linear_svc.predict(x_test)acc_linear_svc = round(linear_svc.score(x_train, y_train) * 100, 2)acc_linear_svcsgd = SGDClassifier()sgd.fit(x_train, y_train)Y_pred = sgd.predict(x_test)acc_sgd = round(sgd.score(x_train, y_train) * 100, 2)acc_sgd
此步使用決策樹作為預測模型,將特徵(樹分支)映射為關於目標值(樹葉)的結論。 目標變數可以採用有限的一組值的樹模型稱為分類樹; 在這些樹結構中,葉代表類標籤,分支代表導致這些類標籤的功能的連接。變數可以採用連續值(通常是實數)的決策樹被稱為回歸樹。 參考維基百科。
迄今為止評估的模型中,模型置信度得分最高。
decision_tree = DecisionTreeClassifier()decision_tree.fit(x_train, y_train)Y_pred = decision_tree.predict(x_test)acc_decision_tree = round(decision_tree.score(x_train, y_train) * 100, 2)acc_decision_tree
隨機森林是最受歡迎的模型之一。隨機森林或隨機決策森林是一種用於分類,回歸和其他任務的集合學習方法,它通過在訓練時構造大量決策樹(n_estimators = 100)並輸出作為類的模式的分類 或預測回歸單個樹。參考維基百科。
迄今為止評估的模型中,模型置信度得分最高。 我們決定使用這個模型的輸出(Y_pred)來創建競賽結果提交。
random_forest = RandomForestClassifier(n_estimators=100)random_forest.fit(x_train, y_train)Y_pred = random_forest.predict(x_test)random_forest.score(x_train, y_train)acc_random_forest = round(random_forest.score(x_train, y_train) * 100, 2)acc_random_forestmodels = pd.DataFrame({ Model: [Support Vector Machines, KNN, Logistic Regression, Random Forest, Naive Bayes, Perceptron, Stochastic Gradient Decent, Linear SVC, Decision Tree], Score: [acc_svc, acc_knn, acc_log, acc_random_forest, acc_gaussian, acc_perceptron, acc_sgd, acc_linear_svc, acc_decision_tree]})models.sort_values(by=Score, ascending=False)
我們提交給比賽網站Kaggle的結果是在6,082項參賽作品中得到3,883分。
參考
這個notebook是基於解決泰坦尼克號比賽和其他資源創建的。- 通過泰坦尼克號的旅程 https://www.kaggle.com/omarelgabry/titanic/a-journey-through-titanic
- pandas入門:Kaggle的泰坦尼克號比賽 https://www.kaggle.com/c/titanic
- 泰坦尼克號最佳工作分類器 https://www.kaggle.com/sinakhorami/titanic-best-working-classifier?scriptVersionId=566580
推薦閱讀:
※霍金已逝,這些物理學家也慢慢被淡忘了
※python入門第一課——安裝python和編譯器
※當我們從事數據崗位時我們需要會什麼
※數據分析師必備技能—MySQL(1)
※從猴子「編程」猴哥