機器學(xué)習(xí)的工作原理-代碼示例
訓(xùn)練模型以預(yù)測誰能幸存下來。

[注意:請使用我們的完全交互式筆記本在此處自行構(gòu)建模型。 無需任何編碼經(jīng)驗。]
如果您像我,則需要玩一些東西然后"自己動手"才能真正理解它。 在這里,我們將舉例說明機器學(xué)習(xí)的真正原理。
您將建立自己的機器學(xué)習(xí)模型,以預(yù)測乘客在泰坦尼克號上幸存的可能性。 該模型僅通過查看數(shù)據(jù)即可自行學(xué)習(xí)模式。
了解進(jìn)行機器學(xué)習(xí)的步驟
遵循以下步驟:
- 加載數(shù)據(jù)并進(jìn)行可視化探索;
- 為機器學(xué)習(xí)算法準(zhǔn)備數(shù)據(jù);
- 訓(xùn)練模型-讓算法從數(shù)據(jù)中學(xué)習(xí);
- 評估模型-查看它在從未見過的數(shù)據(jù)上的表現(xiàn)如何;
- 分析模型-查看需要多少數(shù)據(jù)才能正常運行。
要自己構(gòu)建機器學(xué)習(xí)模型,請打開配套筆記本。 您將無需任何設(shè)置即可運行真實的機器學(xué)習(xí)代碼-它可以正常工作。
了解機器學(xué)習(xí)工具
關(guān)于機器學(xué)習(xí)工具,有很多選擇。 在本指南中,我們使用一些最受歡迎和功能最強大的機器學(xué)習(xí)庫,即:
- Python:一種高級編程語言,以其易讀性著稱,是全球最受歡迎的機器學(xué)習(xí)語言。
- Pandas:Python庫,將類似電子表格的功能引入該語言。
- Seaborn:一個用于繪制圖表和其他圖形的庫。
- Scikit學(xué)習(xí):Python的機器學(xué)習(xí)庫,提供用于預(yù)測數(shù)據(jù)分析的簡單工具。
- DRLearn:為此數(shù)據(jù)集構(gòu)建的我們自己的DataRevenue Learn模塊。
這些都是很好的工具,因為它們既適用于初學(xué)者,也適用于大型公司(如摩根大通)。
探索我們的數(shù)據(jù)集
我們將使用著名的"泰坦尼克號"數(shù)據(jù)集-稍有病態(tài)但引人入勝的數(shù)據(jù)集,其中包含泰坦尼克號上乘客的詳細(xì)信息。 我們?yōu)槊课怀丝吞峁┝舜罅繑?shù)據(jù),包括:
- 名稱,
- 性別,
- 年齡,
- 機票艙位。
我們的數(shù)據(jù)采用行和列的標(biāo)準(zhǔn)形式,其中每一行代表一位乘客,每一列代表該乘客的屬性。 這是一個示例:
- import pandas as pd
- from DRLearn import DRLearn
- titanic_dataset = pd.read_csv("titanic.csv", index_col=0)
- titanic_dataset.head()

> A few of the passengers that are in the titanic dataset. Source: Author
泰坦尼克號數(shù)據(jù)集中的一些乘客
可視化我們的數(shù)據(jù)集
機器學(xué)習(xí)模型很聰明,但是只能與我們提供給他們的數(shù)據(jù)一樣聰明。 因此,重要的第一步是深入了解我們的數(shù)據(jù)集。
在分析數(shù)據(jù)時,一個很好的起點是檢驗假設(shè)。 持有頭等艙機票的人更有可能生存,所以讓我們看看數(shù)據(jù)是否支持這一點。
您可以在配套筆記本中查看并運行代碼以產(chǎn)生這種可視化效果。
- DRLearn.plot_passenger_class(titanic_dataset)

> 3rd class passengers had the worst survival rate, and 1st class passengers the best. Source: Autho
三等艙乘客的生存率最差,一等艙乘客的生存率最高。
頭等艙中超過60%的人幸存,而三等艙中只有不到30%的人幸存。
您可能還聽說過"婦女和兒童優(yōu)先"一詞。 讓我們看一下性別與生存率之間的相互作用。
- DRLearn.plot_passenger_gender(titanic_dataset)

> Women were much more likely to survive than men. Source: Author
女人比男人更有可能生存。
同樣,我們看到我們的假設(shè)是正確的。 超過70%的女性得以幸存,而只有大約20%的男性得以幸存。
就像這樣,我們?yōu)閿?shù)據(jù)集創(chuàng)建了兩個基本的可視化。 我們可以在這里做更多的事情(對于生產(chǎn)機器學(xué)習(xí)項目,我們當(dāng)然可以這樣做)。 例如,多變量分析將顯示當(dāng)我們一次查看多個變量時會發(fā)生什么。
準(zhǔn)備數(shù)據(jù)
在將數(shù)據(jù)輸入到機器學(xué)習(xí)算法以訓(xùn)練模型之前,我們需要使其對我們的算法更有意義。 我們可以通過忽略某些列并重新格式化其他列來做到這一點。
忽略無用的列
我們已經(jīng)知道,旅客的機票號碼與他們的生存機會之間沒有任何關(guān)聯(lián),因此我們可以顯式忽略該列。 我們先刪除它,然后再將數(shù)據(jù)輸入模型。
重新格式化我們的數(shù)據(jù)
一些功能很有用,但不是原始形式。 例如,標(biāo)簽" male"(男性)和" female"(女性)對人類有意義,但對喜歡數(shù)字的機器沒有意義。 因此,我們可以將這些標(biāo)記分別編碼為" 0"和" 1"。
selected_features, target = DRLearn.extract_features(titanic_dataset)selected_features.sample(5)
一旦準(zhǔn)備好數(shù)據(jù)集,該格式將對機器更友好。 我們在下面提供了一個示例:我們消除了許多無用的列,而剩下的所有列都使用數(shù)字。

> After preparing the dataset it's simpler and now ready for machine learning. Source: Author
準(zhǔn)備完數(shù)據(jù)集后,它變得更簡單了,現(xiàn)在可以進(jìn)行機器學(xué)習(xí)了。
將數(shù)據(jù)集一分為二
現(xiàn)在我們需要訓(xùn)練我們的模型,然后對其進(jìn)行測試。 就像給小學(xué)生提供測試題作為家庭作業(yè)的示例,然后給出考試條件下看不見的問題一樣,我們將在一些數(shù)據(jù)上訓(xùn)練機器學(xué)習(xí)算法,然后查看其在其余數(shù)據(jù)上的表現(xiàn)如何。

> We split our dataset: One part for training the model, and one part for testing it. Source: Author
我們拆分了數(shù)據(jù)集:一部分用于訓(xùn)練模型,另一部分用于測試模型。
- X_train, X_test, y_train, y_test = DRLearn.split_dataset(selected_features, target, split=0.2)
讓我們訓(xùn)練模型!
現(xiàn)在開始有趣的部分! 我們會將訓(xùn)練數(shù)據(jù)輸入模型中,并要求其查找模式。 在這一步中,我們?yōu)槟P吞峁?shù)據(jù)和所需的答案(無論乘客是否幸存)。
該模型從該數(shù)據(jù)中學(xué)習(xí)模式。

> Our machine learning model is trained on the Training set. Source: Author
我們的機器學(xué)習(xí)模型在訓(xùn)練集中進(jìn)行訓(xùn)練。
- model = DRLearn.train_model(X_train, y_train)
測試我們的模型
現(xiàn)在,我們可以通過僅在數(shù)據(jù)集另一半中提供乘客的詳細(xì)信息來測試模型,而無需給出答案。 該算法不知道這些乘客是否幸免于難,但是它將嘗試根據(jù)從訓(xùn)練中學(xué)到的知識進(jìn)行猜測。

> Testing how well our machine learning model works by asking it to predict the results on the test
通過要求我們的機器學(xué)習(xí)模型預(yù)測測試數(shù)據(jù)的結(jié)果來測試其性能如何。
- DRLearn.evaluate_model(model, X_test, y_test)
分析我們的模型
為了更好地了解我們的模型如何工作,我們可以:
- 看看它最依賴哪些功能進(jìn)行預(yù)測;
- 看看如果我們使用更少的數(shù)據(jù),其準(zhǔn)確性將如何變化。
第一個可以幫助我們更好地了解我們的數(shù)據(jù),第二個可以幫助我們了解是否值得嘗試獲取更大的數(shù)據(jù)集。
了解我們的模型發(fā)現(xiàn)的重要內(nèi)容
機器學(xué)習(xí)知道并非所有數(shù)據(jù)都同樣有趣。 通過對特定細(xì)節(jié)進(jìn)行加權(quán),可以做出更好的預(yù)測。 下面的權(quán)重表明,性別是迄今為止預(yù)測生存率的最重要因素。
- DRLearn.explain_model(model, X_train)

> Our model relies mostly on gender, a bit on whether the passenger was in 3rd class or not and on t
我們的模型主要取決于性別,有點取決于乘客是否屬于三等艙以及其家庭人數(shù)。
我們還可以查看算法在預(yù)測特定乘客的生存時注意哪些數(shù)據(jù)方面。 下面我們看到一個算法認(rèn)為很可能幸存的乘客。 它特別注意以下事實:
- 乘客不在三等艙;
- 乘客是女性。
由于該乘客也不屬于頭等艙,因此略微降低了生存的機會,因此最終生存預(yù)測為93%。
- model_interpretation = DRLearn.interpret_model(model, X_test, y_test)
- passenger_number = 3
- DRLearn.analyze_passenger_prediction(model_interpretation, X_test, passenger_number)

> How the model made a prediction for one particular passenger. She had a high survival rate because
該模型如何為一名特定乘客做出預(yù)測。 她的成年率很高,因為她是女性而不是三等班。
了解數(shù)據(jù)量如何影響我們的模型
讓我們對模型進(jìn)行多次訓(xùn)練,看看隨著數(shù)據(jù)量的增加它可以改善多少。 在這里,我們同時繪制了訓(xùn)練得分和測試得分。 后者更有趣,因為它告訴我們模型在看不見的數(shù)據(jù)上的表現(xiàn)如何。
訓(xùn)練得分可以被認(rèn)為是"公開考試":該模型已經(jīng)看到了答案,因此看起來比"測試得分"要高,但是該模型更容易對在測試過程中看到的數(shù)據(jù)表現(xiàn)良好 訓(xùn)練階段。
- DRLearn.visualise_training_progress(model, X_train, y_train, X_test, y_test)

> More data makes our model better (test score). But after ~500 data points the improvement is minim
更多數(shù)據(jù)使我們的模型更好(測試分?jǐn)?shù))。 但是,在大約500個數(shù)據(jù)點之后,改進(jìn)很小。
在這里,我們看到模型擁有的數(shù)據(jù)越多,其性能就越好。 在開始時這會更加明顯,然后添加更多數(shù)據(jù)只會帶來很小的改進(jìn)。
機器學(xué)習(xí)模型不必是"黑匣子"算法。 模型分析可幫助我們了解它們?nèi)绾喂ぷ饕约叭绾胃倪M(jìn)它們。
結(jié)論
就是這樣-您已經(jīng)建立了自己的機器學(xué)習(xí)模型。 現(xiàn)在,您將能夠:
- 了解數(shù)據(jù)科學(xué)團(tuán)隊的日常工作;
- 與您的數(shù)據(jù)科學(xué)或機器學(xué)習(xí)團(tuán)隊更好地溝通;
- 了解機器學(xué)習(xí)最能解決哪些問題;
- 意識到機器學(xué)習(xí)畢竟不是那么令人生畏。
機器學(xué)習(xí)的復(fù)雜部分涉及構(gòu)建和擴(kuò)展定制解決方案的所有細(xì)節(jié)。 這正是我們的專長。因此,如果您需要后續(xù)步驟的幫助,請告訴我們。