全文共2327字,預計學習時長15分鐘
圖源:unsplash
筆者剛開始學習給數據科學編程時,發現要找到創建模塊和包的簡單解釋以及教程非常困難,尤其是數據科學項目方面。
數據科學代碼通常是非常線性的。一般情況下,要先從數據源提取數據,應用一系列轉換,然後執行分析、計算或訓練模型。但是爲了代碼的可讀性、高效性和可重複性,將代碼模塊化並打包很有用。
本文將告訴你如何爲數據科學和機器學習創建和使用自己的包和模塊。筆者將使用成年人數據集,這個數據集通常用來建立分類機器學習模型,目標是預測給定成年人的年收入是否超過5萬美元。
模塊的數據科學用例
Python模塊僅僅是Python的一組操作,通常是函數形式,保存在擴展名爲.py的文件中。可以將該文件導入到Jupyter notebook、IPython shell或其他模塊中,以便在項目中使用。
嘗試運行一個實例。如下代碼(從CSV文件中讀取)將使用Pandas:
import pandas as pddata =pd.read_csv('adults_data.csv')
data.head()
這個數據集包含許多分類特徵。如果打算用它來訓練機器學習模型,就需要先執行一些預處理。通過分析這些數據,筆者決定在訓練模型之前,採取以下步驟對數據進行預處理。
· 將僱主的單位類型、婚姻狀況、家庭關係、種族和性別進行獨熱編碼。
· 選取最常見的值,將餘下的值歸爲“其他”,並對結果特徵進行獨熱編碼。該操作在最高教育水平、工作類型、原籍國中執行,因爲它們包含大量特殊的值。
· 縮放剩餘數值。
執行這些任務需要編寫大量代碼,這些任務都可能被多次執行,爲使代碼更具可讀性並易於重用,可以將一系列函數寫入到一個單獨的文件中,並導入到 notebook(一個模塊)中使用。
圖源:unsplash
編寫模塊
要創建模塊,就需要創建擴展名爲.py的新空白文本文件。可以使用普通的文本編輯器,但也有許多人使用集成開發環境(Integrated Development Environment, IDE)。
集成開發環境爲編寫代碼提供了很多附加功能,包括編譯代碼、調試和與Github集成的工具。它有許多不同類型可用,值得自行嘗試,以發現最適合的一款。筆者個人更喜歡PyCharm。
筆者先創建了新的Python文件用以編寫模塊:
將其命名爲preprocessing.py:
在這個文件中編寫第一個預處理函數,並且在Jupyter Notebook中測試導入和使用。
preprocessing.py文件的頂部的代碼如下,併爲其添加了一些註釋,理解起來是不是容易多了。
def one_hot_encoder(df,column_list):
"""Takes in adataframe and a list of columns
for pre-processing via one hotencoding"""
df_to_encode = df[column_list]
df = pd.get_dummies(df_to_encode)
return df
將此模塊導入Jupyter Notebook中,只需編寫以下代碼:
import preprocessing as pr
autoreload是IPython的擴展,用起來方便快捷。倘若在導入之前添加了如下代碼,無論在模塊文件中做出了何種更改,都將同步反映在Notebook中。
%load_ext autoreload
%autoreload 2import preprocessing as pr
測試一下,使用它對數據進行預處理:
cols = ['workclass','marital-status', 'relationship', 'race', 'gender']one_hot_df =pr.one_hot_encoder(data, cols)
現在,將餘下的預處理函數添加到preprocessing.py 文件中:
def one_hot_encoder(df,column_list):
"""Takes in adataframe and a list of columns
for pre-processing via one hotencoding returns
a dataframe of one hot encodedvalues"""
df_to_encode = df[column_list]
df = pd.get_dummies(df_to_encode)
return df
def reduce_uniques(df, column_threshold_dict):
"""Takes in adataframe and a dictionary consisting
of column name : value countthreshold returns the original
dataframe"""
for key, value incolumn_threshold_dict.items():
counts = df[key].value_counts()
others = set(counts[counts< value].index)
df[key] =df[key].replace(list(others), 'Others')
returns a dataframe of scaledvalues"""
df_to_scale = df[column_list]
x = df_to_scale.values
min_max_scaler =preprocessing.MinMaxScaler()
x_scaled =min_max_scaler.fit_transform(x)
df_to_scale = pd.DataFrame(x_scaled,columns=df_to_scale.columns)
return df_to_scale
如果返回到Notebook,就可以使用所有的函數來轉換數據:
import pandas as pd
from sklearn import preprocessing%load_ext autoreload
%autoreload 2import preprocessing as prone_hot_list = ['workclass','marital-status', 'relationship', 'race', 'gender']
reduce_uniques_dict = {'education' : 1000,'occupation' : 3000, 'native-country': 100}
scale_data_list = data.select_dtypes(include=['int64','float64']).columnsone_hot_enc_df = pr.one_hot_encoder(data, one_hot_list)
reduce_uniques_df = pr.reduce_uniques(data, reduce_uniques_dict)
reduce_uniques_df = pr.one_hot_encoder(data, reduce_uniques_dict.keys())
scale_data_df = pr.scale_data(data, scale_data_list)final_data =pd.concat([one_hot_enc_df, reduce_uniques_df, scale_data_df], axis=1)
現在有了一個完全數值化的數據集,可以用來訓練機器學習模型:
轉換列的快照
包
當進行機器學習項目時,通常需要或有時需要創建幾個相關模塊並將其打包,以便一起安裝使用。
圖源:unsplash
例如,筆者目前在使用的一款針對機器學習模型的谷歌雲部署解決方案,名爲 AI Platform。此工具要求在機器學習模型中進行打包預處理、訓練和預測步驟,以便上傳並安裝在平臺上,來部署最終模型。
Python包是包含模塊、文件和子目錄的目錄。該目錄需要包含名爲__init__.py的文件。此文件意味着應將其包含的目錄視爲包,並指定應導入的模塊和函數。
下一步,爲預處理管道模型中的所有步驟創建包。__init__.py 文件的內容如下。
from .preprocessing importone_hot_encoder
from .preprocessing import reduce_uniques
from .preprocessing import scale_data
from .makedata import preprocess_data
同一個包的模塊可以導入到另一個模塊中使用。另一個名爲makedata.py的模塊將被添加進目錄中,該模塊使用preprocessing.py模塊執行數據轉換,然後將最終數據集導出爲CSV文件,供後續使用。
import preprocessing as pr
import pandas as pd
def preprocess_data(df, one_hot_list, reduce_uniques_dict, scale_data_list,output_filename):
one_hot_enc_df =pr.one_hot_encoder(data, one_hot_list)
reduce_uniques_df = pr.reduce_uniques(data,reduce_uniques_dict)
reduce_uniques_df =pr.one_hot_encoder(data, reduce_uniques_dict.keys())
scale_data_df = pr.scale_data(data,scale_data_list)
final_data =pd.concat([one_hot_enc_df, reduce_uniques_df, scale_data_df], axis=1)
final_data.to_csv(output_filename)
新目錄如下所示:
現在可以回到Jupyter Notebook,使用這個包來執行所有的預處理。代碼已經變得十分簡單幹淨:
import pandas as pd%load_extautoreload
%autoreload 2
import preprocessing as prdata = pd.read_csv('adults_data.csv')one_hot_list =['workclass', 'marital-status', 'relationship', 'race', 'gender']
reduce_uniques_dict = {'education' : 1000,'occupation' : 3000, 'native-country': 100}
scale_data_list = data.select_dtypes(include=['int64','float64']).columnspr.preprocess_data(data, one_hot_list, reduce_uniques_dict,scale_data_list,'final_data.csv')
在目前的工作目錄中,將有一個名爲final_data.csv的新CSV文件,包含預處理數據集。現在對其重新讀取並檢查,以確保包按預期執行。
data_ =pd.read_csv('final_data.csv')
data.head()
本文演示瞭如何將模塊和包用於數據科學和機器學習項目,這樣的代碼更具可讀性和可複製性,你學會了嗎?。
我們一起分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 “讀芯術”
(添加小編微信:dxsxbb,加入讀者圈,一起討論最新鮮的人工智能科技哦~)