0
本文作者: AI研習(xí)社-譯站 | 編輯:李書田 | 2020-07-13 11:20 |
字幕組雙語原文:如何在 Python 中建立和訓(xùn)練線性和 logistic 回歸 ML 模型?
英語原文:How to Build and Train Linear and Logistic Regression ML Models in Python
翻譯:雷鋒字幕組(Key、君思)
線性回歸與logistic回歸,是目前最流行的兩個機(jī)器學(xué)習(xí)模型。
在我的上一篇教程里,你們已經(jīng)學(xué)習(xí)了線性回歸機(jī)器學(xué)習(xí)算法背后的歷史和理論。
本教程的主題是:如何用Python中的scikit-learn庫,建立、訓(xùn)練和測試你的第一個線性回歸機(jī)器學(xué)習(xí)模型。
本教程中將使用的數(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ì)的解釋。
正如之前所提到的,我們將用到一個房屋信息的數(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ù))。
現(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)
該指令的輸入如下:
下一步,就讓我們開始建立我們的線性回歸模型吧。
我們要做的第一件事,是將我們的數(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ù)。
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í)的線性回歸模型了。
首先,我們需要從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'])
這里的輸出就好理解多了:
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)
這是此代碼生成的散點圖:
如您所見,我們的預(yù)測值非常接近數(shù)據(jù)集中觀測值的實際值。該散點圖中的一條完美的對角線將表明我們的模型完美地預(yù)測了 y數(shù)組 值。
直觀地評估模型性能的另一種方法是繪制其 殘差,即實際 y數(shù)組 值與預(yù)測 y數(shù)組 值之間的差。
下面的語句是實現(xiàn)此目的簡單方法:
plt.hist(y_test - predictions)
這是此代碼生成的可視化效果:
這是我們的機(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)
同樣,您可以使用以下語句在Python中計算均方誤差:
metrics.mean_squared_error(y_test, predictions)
與均值絕對誤差和均方誤差不同, 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))
注意-如果到目前為止您已經(jīng)在本教程中進(jìn)行編碼,并且已經(jīng)建立了線性回歸模型,則在繼續(xù)之前,您需要打開一個新的Jupyter Notebook(其中沒有代碼)。
泰坦尼克號數(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回歸模型。
和以前一樣,本教程中將使用多個開源軟件庫。這是我通過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腳本中。
在使用機(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)
這將生成以下圖:
如您所見,與幸存者相比,非幸存者的發(fā)病率要高得多。
比較相對于某些其他數(shù)據(jù)特征的生存率也很有用。例如,我們可以 使用以下Python代碼來比較Sex的Male 和 Female 值 之間的生存率 :
sns.countplot(x='Survived', hue='Sex', data=titanic_data)
這將生成以下圖:
如您所見, 性別 為 男性的 乘客比性別 為 女性的乘客更有可能是非幸存者 。
我們可以使用Pclass 變量執(zhí)行類似的分析, 以查看哪個旅客類別最有(和最少)可能有幸存者。
這是執(zhí)行此操作的代碼:
sns.countplot(x='Survived', hue='Pclass', data=titanic_data)
這將生成以下圖:
從該圖中最明顯的觀察結(jié)果是, 當(dāng)泰坦尼克號墜毀時,Pclass 值為 3的乘客-表示最便宜,最不豪華的第三等艙的乘客 更有可能死亡。
首先,讓我們檢查數(shù)據(jù)集中包含缺失數(shù)據(jù)的位置。為此,請運行以下命令:
titanic_data.isnull()
這將生成一個布爾值的DataFrame,如果該單元格 為空值,則該單元格包含 True,否則為 False 。這是它的樣子的圖像:
評估此數(shù)據(jù)集中缺失數(shù)據(jù)的一種更為有用的方法是創(chuàng)建快速可視化。為此,我們可以使用 seaborn 可視化庫。這是快速命令,可用于 使用 seaborn 庫創(chuàng)建 熱圖:
sns.heatmap(titanic_data.isnull(), cbar=False)
這是生成的可視化效果:
在此可視化中,白線表示數(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'])
如您所見, 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í)模型。
現(xiàn)在是時候刪除我們的logistic回歸模型了。
首先,我們刪除“ Cabin” 列。正如我們所提到的,此列中丟失數(shù)據(jù)的普遍性意味著 對丟失數(shù)據(jù)進(jìn)行估算是不明智的 ,因此我們將使用以下代碼將其完全刪除:
titanic_data.drop('Cabin', axis=1, inplace = True)
接下來,讓我們使用pandas dropna() 方法刪除包含丟失數(shù)據(jù)的所有其他列 :
titanic_data.dropna(inplace = True)
我們需要處理的下一個任務(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'])
如您所見,這將創(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ù)集中不存在多重共線性。
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ù)被成功地連接起來。
這意味著我們現(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)在具有以下外觀:
如您所見,該數(shù)據(jù)集中的每個字段現(xiàn)在都是數(shù)字,這使其成為logistic回歸機(jī)器學(xué)習(xí)算法的理想候選者。
接下來,是時候?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)練我們的模型,我們首先需要 使用以下命令從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ù)測。
讓我們使用 剛剛創(chuàng)建的模型logistic回歸模型對測試數(shù)據(jù)進(jìn)行一組預(yù)測 。我們將這些預(yù)測存儲在一個名為predictions的變量中 :
predictions = model.predict(x_test_data)
我們已經(jīng)做出了預(yù)測。接下來讓我們檢查模型的準(zhǔn)確性。
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))
在本教程中,您學(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)載須知。