通過 Python 入門數據科學(Data Science)

Linux Story

純正開源之美 有趣、有料、有意思

通过 Python 入门数据科学(Data Science)

比較老氣的大一新生,很宅,很喜歡動手做東西。

進行科學數據分析,並不一定要用那些昂貴的工具,你也可以試試這些“能幹”的開源工具。

不論你是有著數學或者計算機相關背景的愛好數據科學(Data Science)領域的萌新,或是一個不相關的領域專家,你都不可避免接觸到數據科學。而你又不需要那些昂貴的、特專業的企業軟件的話,那你可以選擇這篇文章所介紹的開源工具!

Python,它的機器學習和數據科學庫(pandas,Keras,TensorFlow,scikit-learn,SciPy,NumPy 等等),和它的擴展的可視化列表庫(Matplotlib,pyplot,Plotly 等等)對於初學者和專家等來說都是出色的開源工具。簡單易學、普及率高、有社區提供支持,並且內置了最新的庫和數據科學所用到的算法,這些工具都能給剛開始學習的你帶來很大的幫助。

很多 Python 庫都繼承自某一個基礎庫(就是我們所熟知的依賴關係),而在科學數據分析領域,最基礎的便是 NumPy 這個庫。它專為數據科學分析設計,NumPy 庫經常用於儲存數據集中的關係型數據部分,這部分數據儲存在它的 ndarray 類型中。這種數據類型便於存儲來自關係型數據表(如 csv 或其他格式的文件)中的數據,反之亦然。

當 scikit 庫中的函數應用於多維數組的時候,其便利性就體現得更加明顯。如果只是進行數據查詢,那麼 SQL 語言是很好的工具,但是對於複雜和資源密集型科學數據操作就顯得蹩腳了,而把數據存儲在 ndarray 中則可以提高效率和速度(但這種優勢只在處理大量數據時才能顯現出來)。

當你開始用 pandas 來進行知識抽取和分析的時候,pandas 中的 DataFrame 數據類型與 NumPy 中的 ndarray 之間的強強聯合會形成用於知識抽取和計算密集型操作的有力工具。

為了快速說明問題,讓我們打開 Python 的 shell ,然後加載一個關於犯罪分析的數據集,這個數據集使用 pandas 的 DateFrame 類型存儲,讓我們來初探這個被加載的數據集。

1

2

3

4

>>> import pandas as pd

>>> crime_stats = pd.read_csv('BPD_Arrests.csv')

>>> crime_stats.head

通过 Python 入门数据科学(Data Science)

現在,在這個 pandas 的 DataFrame 類型數據集中,我們可以運用 SQL 查詢語句進行大多數查詢。例如,得到所有“Description”屬性的唯一值,SQL 查詢是這樣的:

1

2

$ SELECT unique(“Description”) from crime_stats;

在 pandas 的 DataFrame 裡面實現相應功能的語句是這樣的:

1

2

3

4

5

6

>>> 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):

1

2

3

>>> type(crime_stats['Description'].unique)

之後,我們來把數據傳遞給一個神經元網絡模型,來看看它的預測到底有多準確。給它一個類似的數據如犯罪時間,犯罪類型,和它發生的相關種種,讓它預測用了哪種類型的武器,代碼如下:

1

2

3

4

5

6

7

8

9

10

11

>>> 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)

現在,學習模型已經準備完畢,我們可以進行一些測試來估計它的預測質量和穩定性。讓我們先從一些訓練用的測試數據開始(這部分的原始數據是用來訓練(train)模型的,而不是用於創建模型的):

1

2

3

>>> predict_weapon.predict(training_set_weapons)

array([4, 4, 4, ..., 0, 4, 4])

如你所看到的那樣,它會返回一個列表,每一個數據都是一個預測結果,表示一種武器,對應訓練數據集(training set)中的一條記錄。我們看到數字,而不是武器名,這是因為它和大多數分類算法一樣,為分析大量數據而做出了優化。

對於數組數據,我們有多種方法將數字轉換成能被我們直觀理解的描述形式(如武器名)。在這個例子中,運用的技術是 LabelEncoding ,用的是 sklearn 中 preprocessing 庫中的 LabelEncoder 函數:preprocessing.LableEncoder。它可以對數據進行相關的轉換和逆轉換。在這個例子中,我們用了 LabelEncoder 中的 inverse_transform 函數來看看武器 0 和 4 分別代表了什麼:

1

2

3

>>> preprocessing.LabelEncoder.inverse_transform(encoded_weapons)

array(['HANDS', 'FIREARM', 'HANDS', ..., 'FIREARM', 'FIREARM', 'FIREARM']

這些數據看起來很有意思,但是並沒有得到這個模型的預測準確度是多少,我們來進行一些計算以得到其百分比:

1

2

3

>>> nn_model.score(X, y)

0.81999999999999995

這些數據顯示出了我們的神經網絡模型有將近82%的精確性。這個結果似乎讓人感覺不錯,但是我們也不要忘了更換不同的數據集來測試他的有效性。這裡列舉了一些其他類型的測試,如:相互關係、模糊測試、矩陣測試等等。這些都可以用於測試模型的有效性。然而,雖然我們的模型具有很高的精確度,但是這對普通的犯罪數據集並不是很有用。就像我們用的這個數據集一樣,這個數據集中使用“槍支”這一類武器的記錄非常多,那麼無論我們之後輸入何種數據,預測結果都會更加偏向於使用“槍支”。

在我們分類之前清除數據、消除離群數據和畸變數據是很重要的。預處理越好,我們的精確度就越高。同樣,通過給模型/分類器塞過量數據來提高精確度(高於90%)是很不理智的,因為這樣非但不能達到目的,還會造成過度擬合。

如果你想用交互式圖形界面代替命令行,那麼 Jupyter notebooks 是一個很好的選擇。雖然大多數的事情在命令行中都能處理得很好,但當你開始用 snippets 來生成可視化時,就能體會到 Jupyter 給你帶來的好處。它可以把數據整理的比終端還好。

這裡(https://machinelearningmastery.com/best-machine-learning-resources-for-getting-started/)不僅給大家列出了一些很不錯的機器學習的免費資源,還提供了很多其他指導和教程。由於興趣愛好的不同,你會發現網上有很多可用的開源數據集。但是在剛開始學的時候,Kaggle (https://www.kaggle.com)維護的數據集,和那些政府網站提供的數據集是很好的資源。

本文由 紛寂 翻譯。更多詳情請訪問原文鏈接。

原文鏈接:https://opensource.com/article/18/3/getting-started-data-science

本文鏈接:https://linuxstory.org/getting-started-data-science/


分享到:


相關文章: