丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給AI研習(xí)社-譯站
發(fā)送

0

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

本文作者: AI研習(xí)社-譯站 編輯:李書田 2020-07-13 11:20
導(dǎo)語:本教程的主題是:如何用Python中的scikit-learn庫,建立、訓(xùn)練和測試你的第一個線性回歸機(jī)器學(xué)習(xí)模型。

字幕組雙語原文:如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

英語原文:How to Build and Train Linear and Logistic Regression ML Models in Python

翻譯:雷鋒字幕組(Key、君思)

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

線性回歸與logistic回歸,是目前最流行的兩個機(jī)器學(xué)習(xí)模型。

在我的上一篇教程里,你們已經(jīng)學(xué)習(xí)了線性回歸機(jī)器學(xué)習(xí)算法背后的歷史和理論。

本教程的主題是:如何用Python中的scikit-learn庫,建立、訓(xùn)練和測試你的第一個線性回歸機(jī)器學(xué)習(xí)模型。


第1節(jié):線性回歸

本教程中將使用的數(shù)據(jù)集

    由于線性回歸是我們在本課程中學(xué)習(xí)的第一種機(jī)器學(xué)習(xí)模型,在本教程中我們將使用人工創(chuàng)建的數(shù)據(jù)集。因為這樣我們可以專注于學(xué)習(xí)機(jī)器學(xué)習(xí)的概念,避免在清洗和處理數(shù)據(jù)上浪費不必要的時間。

    具體來說,我們將使用住房數(shù)據(jù)的數(shù)據(jù)集并嘗試預(yù)測住房價格。在建立模型之前,我們首先要導(dǎo)入所需的庫。

本教程中將使用的庫

    我們將導(dǎo)入的第一個庫是pandas,它是源于"panel data"(面板數(shù)據(jù))的復(fù)合詞,是處理表格數(shù)據(jù)最受歡迎的Python庫。

    按照慣例,以別名pd導(dǎo)入pandas。你可以使用以下語句導(dǎo)入pandas

import pandas as pd

    接下來,我們需要導(dǎo)入NumPy,一個流行的數(shù)值計算庫。 Numpy因其NumPy array型數(shù)據(jù)結(jié)構(gòu),以及reshape,arrange,append這些非常實用的方法而聞名。

    按照慣例,以別名np導(dǎo)入NumPy。你可以使用以下語句導(dǎo)入numpy

import numpy as np

    接下來,我們需要導(dǎo)入matplotlib,Python中最受歡迎的數(shù)據(jù)可視化庫。matplotlib通常以別名plt導(dǎo)入, 你可以使用以下語句導(dǎo)入matplotlib:

import matplotlib.pyplot as plt
%matplotlib inline

    語句%matplotlib inline將使我們的matplotlib可視化效果直接嵌入到Jupyter Notebook中,使它們更易于訪問和解釋。

    最后,導(dǎo)入seaborn,這是另一個Python數(shù)據(jù)可視化庫,可以讓我們更輕松地使用matplotlib創(chuàng)建美觀的可視化結(jié)果。

    你可以使用以下語句導(dǎo)入seaborn:

import seaborn as sns

    總結(jié)一下,以下是本教程中需要導(dǎo)入的所有庫:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

    在以后的課程中,我會說明必需導(dǎo)入哪些庫,但不會再像這樣進(jìn)行詳細(xì)的解釋。


導(dǎo)入數(shù)據(jù)集

正如之前所提到的,我們將用到一個房屋信息的數(shù)據(jù)集。數(shù)據(jù)集已經(jīng)以csv文件的形式上傳到我的個人網(wǎng)站,鏈接如下:

https://nickmccullum.com/files/Housing_Data.csv

要向你的Jupyter Notebook中導(dǎo)入數(shù)據(jù)集,首先復(fù)制上述鏈接,粘貼到你的瀏覽器中進(jìn)行下載。然后,將該文件移動到與你的Jupyter Notebook相同的文件夾下。

完成這一步后,輸入以下Python指令將向你的Jupyter Notebook導(dǎo)入房屋數(shù)據(jù)集:

raw_data = pd.read_csv('Housing_Data.csv')

這一數(shù)據(jù)集有著一系列特征,包括:

  • 該區(qū)域居住人口的平均收入

  • 該區(qū)域房屋的平均房間個數(shù)

  • 房屋的出售價格

  • 房屋的具體地址

這些數(shù)據(jù)都是隨機(jī)生成的,所以你會發(fā)現(xiàn)一些不太合理的細(xì)節(jié)(如某個數(shù)字本應(yīng)該是整數(shù),卻有著多個小數(shù)位數(shù))。


了解數(shù)據(jù)集

現(xiàn)在,數(shù)據(jù)集已被導(dǎo)入并存儲為名為raw_data的變量。你可以用名為info的方法(method)得到該數(shù)據(jù)集的一些大致信息。具體來說,運行指令raw_data.info()將得到:

RangeIndex: 5000 entries, 0 to 4999Data columns (total 7 columns):Avg. Area Income                5000 non-null float64Avg. Area House Age             5000 non-null float64Avg. Area Number of Rooms       5000 non-null float64

另一個有效獲取數(shù)據(jù)集信息的途徑,是生成散點圖矩陣。你可以用seaborn庫中的pairplot方法,并傳入整個數(shù)據(jù)框作為該方法的參數(shù)。完整指令如下:

sns.pairplot(raw_data)

該指令的輸入如下:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

下一步,就讓我們開始建立我們的線性回歸模型吧。


建立機(jī)器學(xué)習(xí)的線性回歸模型

我們要做的第一件事,是將我們的數(shù)據(jù)分為一個x數(shù)組(包含我們用于預(yù)測的所有數(shù)據(jù))以及一個y數(shù)組(包含我們試圖預(yù)測的所有數(shù)據(jù))。

首先,我們要選擇包含哪幾列。你可以通過raw_data.columns指令得到該數(shù)據(jù)框的所有列名。其輸出為:

Index(['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',       'Avg. Area Number of Bedrooms', 'Area Population', 'Price', 'Address'],      dtype='object')

我們的x數(shù)組將包含以上的大部分變量,只排除Price(因為這就是我們試圖預(yù)測的一列)和Address(因為它只有文本信息)。

讓我們建立x數(shù)組,并將它存儲為變量x:

x = raw_data[['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',       'Avg. Area Number of Bedrooms', 'Area Population']]

然后,建立y數(shù)組,并存儲為變量y:

y = raw_data['Price']

于是,我們便成功地將數(shù)據(jù)集分成了一個x數(shù)組(即模型的輸入值)與一個y數(shù)組(即模型的輸出值)。在下一節(jié),我們將學(xué)習(xí)如何進(jìn)一步將數(shù)據(jù)集劃分為訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù)。


劃分?jǐn)?shù)據(jù)集為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)

scikit-learn庫令我們可以很簡單地將我們的數(shù)據(jù)集劃分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)。要做到這一步,我們需要從scikit-learn的model_selection模塊導(dǎo)入train_test_split函數(shù):

from sklearn.model_selection import train_test_split

train_test_split函數(shù)需要三個輸入值:

  • 我們的x數(shù)組

  • 我們的y數(shù)組

  • 我們想要的測試數(shù)據(jù)大小

有了這些參數(shù),train_test_split函數(shù)便會為我們劃分?jǐn)?shù)據(jù)了!如果我們希望我們的測試數(shù)據(jù)占全部數(shù)據(jù)的30%,可以通過以下代碼來實現(xiàn):

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

讓我們打開黑箱,看看里面到底發(fā)生了什么。

train_test_split函數(shù)返回了一個長度為4的Python列表,其中的元素分別為x_train,x_test,y_train和y_test。然后,我們便可以通過Python的列表解包,將這些變量分配到各自對應(yīng)的變量名下。現(xiàn)在,我們已經(jīng)很好地劃分了我們的數(shù)據(jù)集,是時候建立和訓(xùn)練機(jī)器學(xué)習(xí)的線性回歸模型了。


建立和訓(xùn)練模型

首先,我們需要從scikit-learn庫中導(dǎo)入LinearRegression估計器。其Python指令如下:

from sklearn.linear_model import LinearRegression

然后,我們需要建立LinearRegression這個Python對象的一個實例。我們將它存儲為變量model。相應(yīng)代碼如下:

model = LinearRegression()

我們可以用scikit-learn庫的fit方法,在我們的訓(xùn)練數(shù)據(jù)上訓(xùn)練這個模型。

model.fit(x_train, y_train)

現(xiàn)在,我們已經(jīng)將這個模型訓(xùn)練好了。你可以通過以下指令查看這個模型的每個參數(shù):

print(model.coef_)

上述指令將輸出:

[2.16176350e+01 1.65221120e+05 1.21405377e+05 1.31871878e+03
 1.52251955e+01]

類似地,也可以通過以下指令查看所得回歸方程的截距:

print(model.intercept_)

上述指令將輸出:

-2641372.6673013503

還有一個更好的方法來查看所有參數(shù),那就是將它們一并放進(jìn)一個數(shù)據(jù)框里。這一步可以通過以下指令完成:

pd.DataFrame(model.coef_, x.columns, columns = ['Coeff'])

這里的輸出就好理解多了:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

讓我們花點時間,來看看這些參數(shù)分別是什么意思。我們具體查看變量Area Population,其參數(shù)大概為15。

這一數(shù)字表示,若其他所有變量保持不變,而Area Population增加了1個單位的話,那么我們預(yù)測的變量——在這里是Price——將增加15個單位。

換句話說,一個變量有著很大的參數(shù),說明它對你試圖預(yù)測的變量有著很大的影響。而一個有著小參數(shù)的變量,其影響也同樣較小。

現(xiàn)在我們已經(jīng)建立了我們的第一個機(jī)器學(xué)習(xí)線性回歸模型,是時候用這個模型去為我們的測試數(shù)據(jù)做預(yù)測了。


根據(jù)我們的模型做出預(yù)測

scikit-learn  使從機(jī)器學(xué)習(xí)模型進(jìn)行預(yù)測變得非常容易。您只需要 在 我們之前創(chuàng)建的模型變量上調(diào)用  預(yù)報方法  。

由于  預(yù)測  變量旨在進(jìn)行預(yù)測,因此它僅接受  x數(shù)組  參數(shù)。它將 為您生成  y值!

這是您需要使用predict  方法從我們的模型生成預(yù)測的代碼  :

predictions = model.predict(x_test)

 x_test 特征值 存儲在 predictions 預(yù)測變量中。由于我們使用  train_test_split  方法將實際  值存儲  在  y_test中,因此下一步要做的是將  預(yù)測  數(shù)組的值與y_test的值進(jìn)行  比較。

一種簡單的方法是使用散點圖繪制兩個數(shù)組。 使用  plt.scatter  方法很容易構(gòu)建  

plt.scatter(y_test, predictions)

這是此代碼生成的散點圖:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

如您所見,我們的預(yù)測值非常接近數(shù)據(jù)集中觀測值的實際值。該散點圖中的一條完美的對角線將表明我們的模型完美地預(yù)測了  y數(shù)組  值。

直觀地評估模型性能的另一種方法是繪制其  殘差,即實際  y數(shù)組  值與預(yù)測  y數(shù)組  值之間的差。

下面的語句是實現(xiàn)此目的簡單方法:

plt.hist(y_test - predictions)

這是此代碼生成的可視化效果:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

這是我們的機(jī)器學(xué)習(xí)模型殘差的直方圖。

您可能會注意到,我們的機(jī)器學(xué)習(xí)模型中的殘差似乎呈正態(tài)分布。這是一個很好的信號!

它表明我們已經(jīng)選擇了適當(dāng)?shù)哪P皖愋停ㄔ谶@種情況下為線性回歸)來根據(jù)我們的數(shù)據(jù)集進(jìn)行預(yù)測。在本課程的后面,我們將詳細(xì)了解如何確保使用正確的模型。


測試模型的性能

在本課程開始時,我們了解到,回歸機(jī)器學(xué)習(xí)模型使用了三個主要性能指標(biāo):

  • 平均絕對誤差

  • 均方誤差

  • 均方根誤差

現(xiàn)在,我們將看到如何為本教程中構(gòu)建的模型計算這些指標(biāo)中的每一個。在繼續(xù)之前,請在Jupyter Notebook中運行以下import語句:

from sklearn import metrics

平均絕對誤差(MAE)

您可以使用以下語句在Python中計算平均絕對錯誤:

metrics.mean_absolute_error(y_test, predictions)


均方誤差(MSE)

同樣,您可以使用以下語句在Python中計算均方誤差:

metrics.mean_squared_error(y_test, predictions)


均方根誤差(RMSE)

與均值絕對誤差和均方誤差不同,  scikit-learn  實際上沒有內(nèi)置的方法來計算均方根誤差。

幸運的是,它確實不需要。由于均方根誤差只是均方根誤差的平方根,因此您可以使用NumPy的  sqrt  方法輕松地進(jìn)行計算:

np.sqrt(metrics.mean_squared_error(y_test, predictions))


本教程的完整代碼

這是此Python線性回歸機(jī)器學(xué)習(xí)教程的全部代碼。您也可以在此GitHub存儲庫中查看它  。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
raw_data = pd.read_csv('Housing_Data.csv')
x = raw_data[['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',
       'Avg. Area Number of Bedrooms', 'Area Population']]
y = raw_data['Price']
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3)
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_train, y_train)
print(model.coef_)
print(model.intercept_)
pd.DataFrame(model.coef_, x.columns, columns = ['Coeff'])
predictions = model.predict(x_test)
# plt.scatter(y_test, predictions)
plt.hist(y_test - predictions)
from sklearn import metrics
metrics.mean_absolute_error(y_test, predictions)
metrics.mean_squared_error(y_test, predictions)
np.sqrt(metrics.mean_squared_error(y_test, predictions))


第2節(jié):logistic 回歸

注意-如果到目前為止您已經(jīng)在本教程中進(jìn)行編碼,并且已經(jīng)建立了線性回歸模型,則在繼續(xù)之前,您需要打開一個新的Jupyter Notebook(其中沒有代碼)。


我們將在本教程中使用的數(shù)據(jù)集

泰坦尼克號數(shù)據(jù)集是非常著名的數(shù)據(jù)集,其中包含有關(guān)泰坦尼克號上乘客的特征。它通常用作logistic回歸問題的入門數(shù)據(jù)集。

在本教程中,我們將結(jié)合泰坦尼克號數(shù)據(jù)集和Python logistic回歸模型來預(yù)測乘客是否在泰坦尼克號墜機(jī)事故中幸免。

在  原來的泰坦尼克號數(shù)據(jù)集  是公開的上  Kaggle.com,這是一個網(wǎng)站,主機(jī)的數(shù)據(jù)集和數(shù)據(jù)科學(xué)競賽。

為了使您本課程的學(xué)生更輕松,我們將使用Titanic數(shù)據(jù)集的半清潔版本,這將節(jié)省您在數(shù)據(jù)清潔和處理上的時間。

實際上,已清理的Titanic數(shù)據(jù)集已可供您使用。您可以通過單擊以下鏈接下載數(shù)據(jù)文件:

下載此文件后, 在同一工作目錄中打開  Jupyter Notebook,我們可以開始構(gòu)建 logistic回歸模型。


我們將在本教程中使用的導(dǎo)入

和以前一樣,本教程中將使用多個開源軟件庫。這是我通過Python Logistic回歸模型進(jìn)行編碼時需要遵循的導(dǎo)入:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

接下來,我們需要將Titanic數(shù)據(jù)集導(dǎo)入到我們的Python腳本中。


通過探索性數(shù)據(jù)分析了解我們的數(shù)據(jù)集

每個分類類別的普遍性

在使用機(jī)器學(xué)習(xí)技術(shù)對分類問題進(jìn)行建模時,了解類別之間的比率始終是一個好主意。對于此特定問題,查看我們的訓(xùn)練數(shù)據(jù)中有多少幸存者與非幸存者是有用的。

一種簡單的可視化方法是使用  seaborn  plot  countplot。在此示例中,您可以 使用以下Python代碼創(chuàng)建適當(dāng)?shù)?nbsp; seasborn繪圖:

sns.countplot(x='Survived', data=titanic_data)

這將生成以下圖:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

如您所見,與幸存者相比,非幸存者的發(fā)病率要高得多。


性別之間的成活率

比較相對于某些其他數(shù)據(jù)特征的生存率也很有用。例如,我們可以 使用以下Python代碼來比較Sex的Male  和  Female  值  之間的生存率  :

sns.countplot(x='Survived', hue='Sex', data=titanic_data)

這將生成以下圖:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

如您所見,  性別  為  男性的  乘客比性別  為  女性的乘客更有可能是非幸存者  。


旅客艙位之間的成活率

我們可以使用Pclass  變量執(zhí)行類似的分析,  以查看哪個旅客類別最有(和最少)可能有幸存者。

這是執(zhí)行此操作的代碼:

sns.countplot(x='Survived', hue='Pclass', data=titanic_data)

這將生成以下圖:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

從該圖中最明顯的觀察結(jié)果是, 當(dāng)泰坦尼克號墜毀時,Pclass  值為  3的乘客-表示最便宜,最不豪華的第三等艙的乘客  更有可能死亡。


從我們的數(shù)據(jù)集中刪除空數(shù)據(jù)

首先,讓我們檢查數(shù)據(jù)集中包含缺失數(shù)據(jù)的位置。為此,請運行以下命令:

titanic_data.isnull()

這將生成一個布爾值的DataFrame,如果該單元格 為空值,則該單元格包含  True,否則為  False  。這是它的樣子的圖像:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

評估此數(shù)據(jù)集中缺失數(shù)據(jù)的一種更為有用的方法是創(chuàng)建快速可視化。為此,我們可以使用  seaborn  可視化庫。這是快速命令,可用于 使用  seaborn  庫創(chuàng)建  熱圖:

sns.heatmap(titanic_data.isnull(), cbar=False)

這是生成的可視化效果:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

在此可視化中,白線表示數(shù)據(jù)集中缺少的值。您會看到“  年齡”  和“  機(jī)艙”列包含“泰坦尼克號”數(shù)據(jù)集中大部分丟失的數(shù)據(jù)。

 特別是“  年齡”列包含的缺失量很小,我們可以使用某種形式的數(shù)學(xué)來填充缺失數(shù)據(jù)。另一方面,  機(jī)艙  數(shù)據(jù)缺少足夠的數(shù)據(jù),因此我們有可能將其完全從模型中刪除。

用其余數(shù)據(jù)集中的平均數(shù)據(jù)填充缺失數(shù)據(jù)的過程稱為  歸因。現(xiàn)在,我們將使用  插補(bǔ)  來填充“ 年齡”  列中的缺失數(shù)據(jù)  。

估算的最基本形式是   用 整個數(shù)據(jù)集中的平均年齡值 填充缺失的  年齡數(shù)據(jù)  。但是,有更好的方法。

我們將 使用 該乘客所屬 的特定Pclass乘客艙的平均Age值來  填充缺少的  Age值  。要了解為什么這樣做有用,請考慮以下箱線圖:

sns.boxplot(titanic_data['Pclass'], titanic_data['Age'])

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

如您所見,  Pclass  值為  1  (最昂貴的乘客艙)的乘客往往是最老的,而Pclass  值為  3  (最便宜的乘客)的乘客  往往是最年輕的。這是非常符合邏輯的,所以我們將使用的平均  年齡  不同范圍內(nèi)的值  Pclass  數(shù)據(jù)  imputate  我們丟失的數(shù)據(jù)  年齡  列。

對像泰坦尼克號數(shù)據(jù)集這樣的數(shù)據(jù)集執(zhí)行插補(bǔ)的最簡單方法  是構(gòu)建自定義函數(shù)。首先,我們需要確定 每個  Pclass  值的平均  Age值。

#Pclass value 1
titanic_data[titanic_data['Pclass'] == 1]['Age'].mean()
#Pclass value 2
titanic_data[titanic_data['Pclass'] == 2]['Age'].mean()
#Pclass 3
titanic_data[titanic_data['Pclass'] == 2]['Age'].mean()

這是我們將用來估算  缺少的  Age  變量的最終函數(shù)  :

def impute_missing_age(columns):
    age = columns[0]
    passenger_class = columns[1]
    
    if pd.isnull(age):
        if(passenger_class == 1):
            return titanic_data[titanic_data['Pclass'] == 1]['Age'].mean()
        elif(passenger_class == 2):
            return titanic_data[titanic_data['Pclass'] == 2]['Age'].mean()
        elif(passenger_class == 3):
            return titanic_data[titanic_data['Pclass'] == 3]['Age'].mean()
        
    else:
        return age

現(xiàn)在,該插補(bǔ)功能已經(jīng)完成,我們需要將其應(yīng)用于titanic_data  DataFrame 中的每一行  。Python的  apply  方法是一個出色的工具:

titanic_data['Age'] = titanic_data[['Age', 'Pclass']].apply(impute_missing_age, axis = 1)

既然我們已經(jīng) 對每一行執(zhí)行了  估算以處理丟失的  Age  數(shù)據(jù),那么讓我們研究一下原始箱形圖:

sns.heatmap(titanic_data.isnull(), cbar=False)

您會 發(fā)現(xiàn)我們的熊貓DataFrame 的Age列中不再缺少任何數(shù)據(jù)  !

您可能想知道為什么我們要花費大量時間 專門處理“ 年齡”列中的丟失數(shù)據(jù)  。這是因為考慮到年齡  對大多數(shù)災(zāi)難和疾病生存的影響,  在我們的數(shù)據(jù)集中,該變量可能具有很高的預(yù)測價值。

現(xiàn)在我們已經(jīng)了解了該數(shù)據(jù)集的結(jié)構(gòu)并刪除了缺失的數(shù)據(jù),讓我們開始構(gòu)建logistic回歸機(jī)器學(xué)習(xí)模型。


建立logistic回歸模型

現(xiàn)在是時候刪除我們的logistic回歸模型了。


刪除缺少太多數(shù)據(jù)的列

首先,我們刪除“  Cabin” 列。正如我們所提到的,此列中丟失數(shù)據(jù)的普遍性意味著 對丟失數(shù)據(jù)進(jìn)行估算是不明智的  ,因此我們將使用以下代碼將其完全刪除:

titanic_data.drop('Cabin', axis=1, inplace = True)

接下來,讓我們使用pandas dropna()  方法刪除包含丟失數(shù)據(jù)的所有其他列  :

titanic_data.dropna(inplace = True)


使用虛擬變量處理分類數(shù)據(jù)

我們需要處理的下一個任務(wù)是處理分類特征。即,我們需要找到一種方法來對非自然數(shù)值的觀測值進(jìn)行數(shù)值處理。

性別  列就是一個很好的例子,該  列具有兩個值:  Male  和  Female。同樣,“  登船”一  欄包含一個字母,表示該乘客離開的城市。

為了解決這個問題,我們將創(chuàng)建  偽變量。這些為非數(shù)值特征的每個類別分配一個數(shù)值。

幸運的是,  pandas  具有一個名為get_dummies()的內(nèi)置方法   ,可輕松創(chuàng)建虛擬變量。該  get_dummies  方法確實有一個問題-它會在數(shù)據(jù)幀列中的每個值創(chuàng)建新列。

讓我們考慮一個示例,以幫助您更好地理解這一點。如果我們 在Age  列上調(diào)用  get_dummies()方法,  則會得到以下輸出:

pd.get_dummies(titanic_data['Sex'])

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

如您所見,這將創(chuàng)建兩個新列:  female  和  male。這些列都將是彼此的完美預(yù)測,由于值  0  在  雌性列指示的值  1  在  雄性  柱,反之亦然。

這稱為  多重共線性  ,它會大大降低算法的預(yù)測能力。要刪除它,我們可以將參數(shù)drop_first = True添加   到  get_dummies  方法中,如下所示:

pd.get_dummies(titanic_data['Sex'], drop_first = True)

現(xiàn)在,讓我們?yōu)槲覀兊奶摂M變量列  性別  和  走上  列,并將它們分配給變量稱為  性  和  進(jìn)發(fā)。

sex_data = pd.get_dummies(titanic_data['Sex'], drop_first = True)
embarked_data = pd.get_dummies(titanic_data['Embarked'], drop_first = True)

還有就是要注意的一個重要的事情有關(guān)  走上  下面定義的變量。它有兩列:  Q  和  S,但是由于我們已經(jīng)刪除了另一列(  C  列),因此其余兩列都不是彼此的完美預(yù)測變量,因此   在修改后的新數(shù)據(jù)集中不存在多重共線性。


將虛擬變量添加到  pandas  DataFrame

Next we need to add our sex and embarked columns to the DataFrame.

您可以   使用以下代碼 將這些數(shù)據(jù)列連接到現(xiàn)有的  pandas DataFrame中:

titanic_data = pd.concat([titanic_data, sex_data, embarked_data], axis = 1)

現(xiàn)在,如果您運行命令  print(titanic_data.columns),那么Jupyter Notebook將生成以下輸出:

Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Embarked', 'male', 'Q', 'S'],
      dtype='object')

的存在  男性,  Q和  S  列顯示,我們的數(shù)據(jù)被成功地連接起來。


從數(shù)據(jù)集中刪除不必要的列

這意味著我們現(xiàn)在可以 從DataFrame中刪除原始的  Sex  和  Embarked列。還有其他一些列(如  Name  ,  PassengerId,  Ticket)無法預(yù)測泰坦尼克號的撞車幸存率,因此我們也將其刪除。以下代碼為我們處理了此問題:

titanic_data.drop(['Name', 'Ticket', 'Sex', 'Embarked'], axis = 1, inplace = True)

如果您 現(xiàn)在打印  titanic_data.columns,那么Jupyter Notebook將生成以下輸出:

Index(['Survived', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare',
       'male', 'Q', 'S'],
      dtype='object'

DataFrame現(xiàn)在具有以下外觀:

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

如您所見,該數(shù)據(jù)集中的每個字段現(xiàn)在都是數(shù)字,這使其成為logistic回歸機(jī)器學(xué)習(xí)算法的理想候選者。


創(chuàng)建培訓(xùn)數(shù)據(jù)和測試數(shù)據(jù)

接下來,是時候?qū)⑽覀兊?nbsp; titanic_data  分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)了。和以前一樣,我們將使用scikit-learn的內(nèi)置功能   來執(zhí)行此操作。

首先,我們需要將我們的數(shù)據(jù)分為  x  值(我們將用于進(jìn)行預(yù)測 的數(shù)據(jù))和  y值(我們正在嘗試預(yù)測的數(shù)據(jù))。以下代碼處理此問題:

y_data = titanic_data['Survived']
x_data = titanic_data.drop('Survived', axis = 1)

接下來,我們需要 從scikit-learn導(dǎo)入  train_test_split函數(shù)  。以下代碼執(zhí)行此導(dǎo)入:

from sklearn.model_selection import train_test_split

最后,我們可以 結(jié)合使用  train_test_split函數(shù)和列表解壓縮來生成我們的訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù):

x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size = 0.3)

請注意,在這種情況下,測試數(shù)據(jù)是參數(shù)test_size = 0.3指定的原始數(shù)據(jù)集的30%  。

現(xiàn)在,我們?yōu)閘ogistic回歸模型創(chuàng)建了訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)。我們將在本教程的下一部分中訓(xùn)練我們的模型。


訓(xùn)練logistic回歸模型

要訓(xùn)練我們的模型,我們首先需要 使用以下命令從scikit-learn導(dǎo)入適當(dāng)?shù)哪P?nbsp; :

from sklearn.linear_model import LogisticRegression

接下來,我們需要通過實例化LogisticRegression  對象的實例來創(chuàng)建模型  :

model = LogisticRegression()

要訓(xùn)練模型,我們需要 在 剛剛創(chuàng)建的LogisticRegression對象上調(diào)用  fit方法,  并傳入  x_training_data  和  y_training_data  變量,如下所示:

model.fit(x_training_data, y_training_data)

我們的模型現(xiàn)已訓(xùn)練完畢。我們將在本教程的下一部分中開始使用此模型進(jìn)行預(yù)測。


使用我們的Logistic回歸模型進(jìn)行預(yù)測

讓我們使用 剛剛創(chuàng)建的模型logistic回歸模型對測試數(shù)據(jù)進(jìn)行一組預(yù)測  。我們將這些預(yù)測存儲在一個名為predictions的變量中  :

predictions = model.predict(x_test_data)

我們已經(jīng)做出了預(yù)測。接下來讓我們檢查模型的準(zhǔn)確性。


測量Logistic回歸機(jī)器學(xué)習(xí)模型的性能

scikit-learn具有一個出色的內(nèi)置模塊,稱為分類 _報告   ,可輕松衡量分類機(jī)器學(xué)習(xí)模型的性能。我們將使用此模塊來評估我們剛剛創(chuàng)建的模型的性能。

首先,讓我們導(dǎo)入模塊:

from sklearn.metrics import classification_report

接下來,讓我們使用該模塊為我們的logistic回歸機(jī)器學(xué)習(xí)模塊計算性能指標(biāo):

classification_report(y_test_data, predictions)

這是此命令的輸出:

             precision    recall  f1-score   support
           0       0.83      0.87      0.85       169
           1       0.75      0.68      0.72        98
    accuracy                           0.80       267
   macro avg       0.79      0.78      0.78       267
weighted avg       0.80      0.80      0.80       267

如果您有興趣查看原始的混淆矩陣并手動計算性能指標(biāo),則可以使用以下代碼進(jìn)行操作:

from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test_data, predictions))

這將產(chǎn)生以下輸出:

[[145  22]
 [ 30  70]]


本教程的完整代碼

您可以在GitHub存儲庫中查看本教程的完整代碼  。還將其粘貼在下面以供您參考:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
#Import the data set
titanic_data = pd.read_csv('titanic_train.csv')
#Exploratory data analysis
sns.heatmap(titanic_data.isnull(), cbar=False)
sns.countplot(x='Survived', data=titanic_data)
sns.countplot(x='Survived', hue='Sex', data=titanic_data)
sns.countplot(x='Survived', hue='Pclass', data=titanic_data)
plt.hist(titanic_data['Age'].dropna())
plt.hist(titanic_data['Fare'])
sns.boxplot(titanic_data['Pclass'], titanic_data['Age'])
#Imputation function
def impute_missing_age(columns):
    age = columns[0]
    passenger_class = columns[1]
    
    if pd.isnull(age):
        if(passenger_class == 1):
            return titanic_data[titanic_data['Pclass'] == 1]['Age'].mean()
        elif(passenger_class == 2):
            return titanic_data[titanic_data['Pclass'] == 2]['Age'].mean()
        elif(passenger_class == 3):
            return titanic_data[titanic_data['Pclass'] == 3]['Age'].mean()
        
    else:
        return age
#Impute the missing Age data
titanic_data['Age'] = titanic_data[['Age', 'Pclass']].apply(impute_missing_age, axis = 1)
#Reinvestigate missing data
sns.heatmap(titanic_data.isnull(), cbar=False)
#Drop null data
titanic_data.drop('Cabin', axis=1, inplace = True)
titanic_data.dropna(inplace = True)
#Create dummy variables for Sex and Embarked columns
sex_data = pd.get_dummies(titanic_data['Sex'], drop_first = True)
embarked_data = pd.get_dummies(titanic_data['Embarked'], drop_first = True)
#Add dummy variables to the DataFrame and drop non-numeric data
titanic_data = pd.concat([titanic_data, sex_data, embarked_data], axis = 1)
titanic_data.drop(['Name', 'PassengerId', 'Ticket', 'Sex', 'Embarked'], axis = 1, inplace = True)
#Print the finalized data set
titanic_data.head()
#Split the data set into x and y data
y_data = titanic_data['Survived']
x_data = titanic_data.drop('Survived', axis = 1)
#Split the data set into training data and test data
from sklearn.model_selection import train_test_split
x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size = 0.3)
#Create the model
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
#Train the model and create predictions
model.fit(x_training_data, y_training_data)
predictions = model.predict(x_test_data)
#Calculate performance metrics
from sklearn.metrics import classification_report
print(classification_report(y_test_data, predictions))
#Generate a confusion matrix
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test_data, predictions))


總結(jié)

在本教程中,您學(xué)習(xí)了如何在Python中構(gòu)建線性回歸和logistic回歸機(jī)器學(xué)習(xí)模型。

如果您想了解有關(guān)構(gòu)建,培訓(xùn)和部署前沿機(jī)器學(xué)習(xí)模型的更多信息,我的電子書  實用機(jī)器學(xué)習(xí)  將教您如何使用實際項目構(gòu)建9種不同的機(jī)器學(xué)習(xí)模型。

您可以將代碼從電子書部署到GitHub或個人投資組合,以向潛在雇主展示。這本書將于8月3日發(fā)行,  現(xiàn)在可以50%的價格預(yù)訂

這是您從本文中學(xué)到的內(nèi)容的簡短摘要:

  • 如何導(dǎo)入構(gòu)建線性回歸機(jī)器學(xué)習(xí)算法所需的庫

  • 如何使用scikit-learn將數(shù)據(jù)集分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù) 

  • 如何使用  scikit-learn  訓(xùn)練線性回歸模型并使用該模型進(jìn)行預(yù)測

  • 如何使用scikit-learn計算線性回歸性能指標(biāo) 

  • 為什么Titanic數(shù)據(jù)集經(jīng)常用于學(xué)習(xí)機(jī)器學(xué)習(xí)分類技術(shù)

  • 處理分類機(jī)器學(xué)習(xí)問題的數(shù)據(jù)集時如何執(zhí)行探索性數(shù)據(jù)分析

  • 如何處理Pandas DataFrame中的缺失數(shù)據(jù)

  • 什么  歸集  手段,以及如何使用它來填補(bǔ)丟失的數(shù)據(jù)

  • 如何為機(jī)器學(xué)習(xí)數(shù)據(jù)集中的分類數(shù)據(jù)創(chuàng)建虛擬變量

  • 如何在Python中訓(xùn)練Logistic回歸機(jī)器學(xué)習(xí)模型

  • 如何在Python中使用logistic回歸模型進(jìn)行預(yù)測

  • 如何將  scikit-的  classification_report  為機(jī)器學(xué)習(xí)分類問題快速計算性能指標(biāo)



雷鋒字幕組是由AI愛好者組成的志愿者翻譯團(tuán)隊;團(tuán)隊成員有大數(shù)據(jù)專家、算法工程師、圖像處理工程師、產(chǎn)品經(jīng)理、產(chǎn)品運營、IT咨詢?nèi)恕⒃谛熒?;志愿者們來自IBM、AVL、Adobe、阿里、百度等知名企業(yè),北大、清華、港大、中科院、南卡羅萊納大學(xué)、早稻田大學(xué)等海內(nèi)外高校研究所。

了解字幕組請聯(lián)系微信:tlacttlact

轉(zhuǎn)載請聯(lián)系字幕組微信并注明出處:雷鋒字幕組

雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?

分享:
相關(guān)文章

知情人士

AI研習(xí)社(yanxishe.com)譯站頻道,傳播前沿人工智能知識,讓語言不再成為學(xué)習(xí)知識的門檻。(原雷鋒字幕組)
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說