Python 資料科學入門

2018-11-06 19:50:00

不需要昂貴的工具即可領略資料科學的力量,從這些開源工具起步即可。

無論你是一個具有數學或電腦科學背景的資深資料科學愛好者,還是一個其它領域的專家,資料科學提供的可能性都在你力所能及的範圍內,而且你不需要昂貴的,高度專業化的企業級軟體。本文中討論的開源工具就是你入門時所需的全部內容。

Python,其機器學習和資料科學庫(pandasKerasTensorFlowscikit-learnSciPyNumPy 等),以及大量視覺化庫(MatplotlibpyplotPlotly 等)對於初學者和專家來說都是優秀的自由及開源軟體工具。它們易於學習,很受歡迎且受到社群支援,並擁有為資料科學而開發的最新技術和演算法。它們是你在開始學習時可以獲得的最佳工具集之一。

許多 Python 庫都是建立在彼此之上的(稱為依賴項),其基礎是 NumPy 庫。NumPy 專門為資料科學設計,經常被用於在其 ndarray 資料型別中儲存資料集的相關部分。ndarray 是一種方便的資料型別,用於將關係表中的記錄儲存為 cvs 檔案或其它任何格式,反之亦然。將 scikit 函數應用於多維陣列時,它特別方便。SQL 非常適合查詢資料庫,但是對於執行複雜和資源密集型的資料科學操作,在 ndarray 中儲存資料可以提高效率和速度(但請確保在處理大量資料集時有足夠的 RAM)。當你使用 pandas 進行知識提取和分析時,pandas 中的 DataFrame 資料型別和 NumPy 中的 ndarray 之間的無縫轉換分別為提取和計算密集型操作建立了一個強大的組合。

作為快速演示,讓我們啟動 Python shell 並在 pandas DataFrame 變數中載入來自巴爾的摩的犯罪統計資料的開放資料集,並檢視載入的一部分 DataFrame:

>>>  import pandas as pd>>>  crime_stats = pd.read_csv('BPD_Arrests.csv')>>>  crime_stats.head()

我們現在可以在這個 pandas DataFrame 上執行大多數查詢,就像我們可以在資料庫中使用 SQL 一樣。例如,要獲取 Description 屬性的所有唯一值,SQL 查詢是:

$ SELECT unique(“Description”) from crime_stats;

利用 pandas DataFrame 編寫相同的查詢如下所示:

>>>  crime_stats['Description'].unique()['COMMON   ASSAULT'   'LARCENY'   'ROBBERY   - STREET'   'AGG.   ASSAULT''LARCENY   FROM   AUTO'   'HOMICIDE'   'BURGLARY'   'AUTO   THEFT''ROBBERY   - RESIDENCE'   'ROBBERY   - COMMERCIAL'   'ROBBERY   - CARJACKING''ASSAULT   BY  THREAT'   'SHOOTING'   'RAPE'   'ARSON']

它返回的是一個 NumPy 陣列(ndarray 型別):

>>>  type(crime_stats['Description'].unique())<class   'numpy.ndarray'>

接下來讓我們將這些資料輸入神經網路,看看它能多準確地預測使用的武器型別,給出的資料包括犯罪事件,犯罪型別以及發生的地點:

>>>  from   sklearn.neural_network   import   MLPClassifier>>>  import   numpy   as np>>>>>>  prediction   =  crime_stats[[‘Weapon’]]>>>  predictors   =  crime_stats['CrimeTime',   ‘CrimeCode’,   ‘Neighborhood’]>>>>>>  nn_model   =  MLPClassifier(solver='lbfgs',   alpha=1e-5,   hidden_layer_sizes=(5,2),   random_state=1)>>>>>>predict_weapon   =  nn_model.fit(prediction,   predictors)

現在學習模型準備就緒,我們可以執行一些測試來確定其品質和可靠性。對於初學者,讓我們輸入一個訓練集資料(用於訓練模型的原始資料集的一部分,不包括在建立模型中):

>>>  predict_weapon.predict(training_set_weapons)array([4,   4,   4,   ..., 0,   4,   4])

如你所見,它返回一個列表,每個數位預測訓練集中每個記錄的武器。我們之所以看到的是數位而不是武器名稱,是因為大多數分類演算法都是用數位優化的。對於分類資料,有一些技術可以將屬性轉換為數位表示。在這種情況下,使用的技術是標籤編碼,使用 sklearn 預處理庫中的 LabelEncoder 函數:preprocessing.LabelEncoder()。它能夠對一個資料和其對應的數值表示來進行變換和逆變換。在這個例子中,我們可以使用 LabelEncoder()inverse_transform 函數來檢視武器 0 和 4 是什麼:

>>>  preprocessing.LabelEncoder().inverse_transform(encoded_weapons)array(['HANDS',   'FIREARM',   'HANDS',   ..., 'FIREARM',   'FIREARM',   'FIREARM']

這很有趣,但為了瞭解這個模型的準確程度,我們將幾個分數計算為百分比:

>>>  nn_model.score(X,   y)0.81999999999999995

這表明我們的神經網路模型準確度約為 82%。這個結果似乎令人印象深刻,但用於不同的犯罪資料集時,檢查其有效性非常重要。還有其它測試來做這個,如相關性、混淆、矩陣等。儘管我們的模型有很高的準確率,但它對於一般犯罪資料集並不是非常有用,因為這個特定資料集具有不成比例的行數,其列出 FIREARM 作為使用的武器。除非重新訓練,否則我們的分類器最有可能預測 FIREARM,即使輸入資料集有不同的分布。

在對資料進行分類之前清洗資料並刪除異常值和畸形資料非常重要。預處理越好,我們的見解準確性就越高。此外,為模型或分類器提供過多資料(通常超過 90%)以獲得更高的準確度是一個壞主意,因為它看起來準確但由於過度擬合而無效。

Jupyter notebooks 相對於命令列來說是一個很好的互動式替代品。雖然 CLI 對於大多數事情都很好,但是當你想要執行程式碼片段以生成視覺化時,Jupyter 會很出色。它比終端更好地格式化資料。

這篇文章 列出了一些最好的機器學習免費資源,但是還有很多其它的指導和教學。根據你的興趣和愛好,你還會發現許多開放資料集可供使用。作為起點,由 Kaggle 維護的資料集,以及在州政府網站上提供的資料集是極好的資源。