1:競(jìng)賽
我們將學(xué)習(xí)如何為 Kaggle 競(jìng)賽生成一個(gè)提交答案( submisson )。Kaggle是一個(gè)你通過(guò)完成算法和全世界機(jī)器學(xué)習(xí)從業(yè)者進(jìn)行競(jìng)賽的網(wǎng)站。如果你的算法精度是給出數(shù)據(jù)集中最高的,你將贏得比賽。Kaggle也是一個(gè)實(shí)踐你機(jī)器學(xué)習(xí)技能的非常有趣的方式。
Kaggle網(wǎng)站有幾種不同類型的比賽。其中的預(yù)測(cè)一個(gè)就是預(yù)測(cè)在泰坦尼克號(hào)沉沒(méi)的時(shí)候哪個(gè)乘客會(huì)成為幸存者。 在這個(gè)任務(wù)和下一個(gè)任務(wù)我們將學(xué)習(xí)如何提交我們的答案。
我們的數(shù)據(jù)是 csv 格式。你可以在 這里 下載數(shù)據(jù)開始比賽。
每一行重現(xiàn)了一個(gè)在泰坦尼克的乘客以及和他們有關(guān)的一些信息。讓我們來(lái)看一下各列:
PassengerId:一個(gè)用以標(biāo)記每個(gè)乘客的數(shù)字id
Survived:標(biāo)記乘客是否幸存——幸存(1)、死亡(0)。我們將預(yù)測(cè)這一列。
Pclass:標(biāo)記乘客所屬船層——第一層(1),第二層(2),第三層(3)。
Name:乘客名字。
Sex:乘客性別——男male、女female
Age:乘客年齡。部分。
SibSp:船上兄弟姐妹和配偶的數(shù)量。
Parch:船上父母和孩子的數(shù)量。
Ticket:乘客的船票號(hào)碼。
Fare:乘客為船票付了多少錢。
Cabin:乘客住在哪個(gè)船艙。
Embarked:乘客從哪個(gè)地方登上泰坦尼克號(hào)。
一個(gè)好的開始就是有條理的思考各個(gè)列和我們的預(yù)測(cè)之間的邏輯關(guān)系。
我們都知道婦女和兒童更可能被救。因此, 年齡 和 性別 很可能更好的幫助我們預(yù)測(cè)。認(rèn)為乘客的船層可能會(huì)影響結(jié)果也是符合邏輯的,因?yàn)榈谝粚拥拇摳拷募装濉?Fare 票價(jià)和乘客所住船層相關(guān),而且可能是高度相關(guān)的,但是也可能會(huì)增加一些額外的信息。 SibSp、Parch 兄弟姐妹、配偶、父母/孩子的數(shù)量很可能關(guān)系到是否被某一個(gè)或很多個(gè)人救,會(huì)有很多人去幫助你或者有很多人想到你嘗試去救你。
像 Embarked 登船(也許有一些信息和怎么靠近船的頂部的人的船艙有關(guān)), Ticket票號(hào)和 Name 名字。
這一步通常是習(xí)得相關(guān)的領(lǐng)域知識(shí)[要對(duì)業(yè)務(wù)比較深入],這對(duì)于絕大多數(shù)機(jī)器學(xué)習(xí)任務(wù)來(lái)說(shuō)非常非常非常的重要。
我們非常細(xì)致的處理特征以便我們能從我們現(xiàn)有的數(shù)據(jù)中獲得最有用的信息來(lái)幫助我們進(jìn)行預(yù)測(cè)。
2:觀察數(shù)據(jù)
我們將使用Python3,pandas庫(kù)和scikit-learn庫(kù)來(lái)分析我們的數(shù)據(jù)并且生成一個(gè)提交答案 submisson 。我們將使用代碼框進(jìn)行交互式編程,就和你看到的下面那個(gè)一樣。如果你對(duì)Python還不熟悉,你可能想看一看我們的 課程 。
一個(gè)好的第二步就是仔細(xì)觀察數(shù)據(jù)中的高級(jí)描述。在這種情況下,我們使用pandas的 .describe() 方法來(lái)查看每一列數(shù)值的特性的不同之處。
# We can use the pandas library in python to read in the csv file.
# This creates a pandas dataframe and assigns it to the titanic variable.
titanic = pandas.read_csv("titanic_train.csv")
# Print the first 5 rows of the dataframe.
print(titanic.describe())
3:缺失數(shù)據(jù)
在上一節(jié)你使用 .describe() 方法查看 titanic 數(shù)據(jù)框的時(shí)候,你可能注意到年齡列只有714個(gè)計(jì)數(shù),而其他列都有891個(gè)計(jì)數(shù)。這表明在 年齡 列有一些缺失值——空值(null,NA,非數(shù)字)。
這就意味著數(shù)據(jù)并不是完全的干凈,我們必須自己清洗數(shù)據(jù)。我們不希望不得不刪除有缺失數(shù)據(jù)的行,因?yàn)楦嗟臄?shù)據(jù)能幫助我們訓(xùn)練出一個(gè)更好的算法。當(dāng)然,我們也不想刪除整列,因?yàn)閍ge年齡很可能對(duì)我們的分析非常重要。
有很多種策略來(lái)處理缺失數(shù)據(jù),但是一種簡(jiǎn)單的方法就是將那一列的缺失值用中位數(shù)填充。
我們可以像字典一樣通過(guò)數(shù)據(jù)框索引選取一個(gè)單列。這樣會(huì)給我們一個(gè)pandas Series(序列):
titanic['Age']
我們可以使用 .fillna 方法替換序列中的任何缺失值。 .fillna 可以傳入一個(gè)參數(shù)用參數(shù)的值來(lái)替換缺失值。
在我們的例子中,我們打算用列的中位數(shù)來(lái)填充:
titanic['Age'].fillna(titanic['Age'].median())
之后我們必須將替換后的結(jié)果賦值回原來(lái)的列:
titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())
4:非數(shù)值列
前兩節(jié)我們使用過(guò) .describe() ,你也許也主要到并不是所有的列都顯示出來(lái)了。只有數(shù)值列顯示了。我們的列中有幾個(gè)是非數(shù)值的,當(dāng)你開始做預(yù)測(cè)的時(shí)候這將是一個(gè)問(wèn)題——我們不能將非數(shù)值列傳入機(jī)器學(xué)習(xí)算法中并且期望機(jī)器學(xué)習(xí)算法能理解他們。