Python快速實戰機器學習(2) 數據預處理
- 2019 年 10 月 11 日
- 筆記
導語
機器學習是如今人工智慧時代背景下一個重要的領域,它應用廣泛,如推薦系統,文本分析,影像識別,語言翻譯等等。要想學通這個大的領域不是一件容易的事情,所以我打算集大家之長,開通一個「Python快速實戰機器學習」系列,用Python程式碼實踐機器學習裡面的演算法,旨在理論和實踐同時進行,快速掌握知識。
前面課程:
本文概要
1、學會用pandas導入數據;
2、學會用matplotlib可視化數據;
3、學會用sklearn給標籤編碼。
4、學會用sklearn劃分數據集。
5、學會用sklearn進行特徵縮放。
01 導入數據
import pandas as pd df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header=None) df.tail()
我們使用pandas讀取數據,然後通過pandas中的tail方法輸出最後五行數據,看一下Iris數據集格式:
這是一個來自叫做「UCI Machine Learning Repository」數據集。UCI Machine Learning Repository:它是網路中最古老的數據集源之一,是尋找各種有趣數據集的第一選擇。在這裡,儘管數據集都是用戶自行貢獻的,但清潔程度仍然很高。此外,你可以直接從 UCI Machine Learning Repository 上下載數據,無需註冊。
這個數據集是關於鳶尾花分類的問題,一個150個數據,第一列是編號,第二列到第五列是鳶尾花的各種參數,也叫做「特徵(features)」是我們判斷鳶尾花屬於哪種的依據。最後一列就是鳶尾花的種類。
02 數據可視化
import numpy as np import matplotlib.pyplot as plt Y = df.iloc[0:100,4].values X = df.iloc[0:100,[0,2]].values plt.scatter(X[:50,0], X[:50,1], color='red', marker = 'o', label = 'setosa') plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker = 'x', label = 'versicolor') plt.xlabel('petal length') plt.ylabel('sepal length') plt.legend(loc='upper left') plt.show()
我們抽取出前100條樣本,這正好是Setosa(前五十個數據)和Versicolor(後五十個數據)對應的樣本,我們將Versicolor對應的數據作為類別1,Setosa對應的作為-1。對於特徵,我們抽取出sepal length和petal length兩維度特徵,然後用散點圖對數據進行可視化:
03 標籤編碼
from sklearn.preprocessing import LabelEncoder labelencoder_Y = LabelEncoder() Y = labelencoder_Y.fit_transform(Y)
我們使用sklearn中的preprocessing模組中LabelEncoder函數給鳶尾花的種類Y編碼,因為在編碼之前,Y存儲的是鳶尾花的名字,也就是字元串變數。我們無法用字元串變數進行數值計算,因此我們需要把它變成0,1,2這種格式的數據。大家可以列印編碼後的Y來查看編碼的效果。
04 劃分數據
from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0) print (X_train.shape) print (X_test.shape)
我們使用sklearn中的切分數據集的模組,model_selection來完成訓練集和測試集的劃分。一般而言我們隨機從整個數據集中找到80%的數據作為訓練集,另外20%的數據作為測試集。一個更加嚴謹的辦法是將整個數據集隨機劃分成五份,然後依次用其中的一份作為測試集,另外四份合併作為訓練集,對演算法運行五次,最後取五次的平均值作為最終的結果。這裡我們只用一次,作為演示。大家可以看到我們列印了訓練集和數據集的形狀,的確按照八二分。
05 特徵縮放
from sklearn.preprocessing import StandardScaler sc_X = StandardScaler() X_train = sc_X.fit_transform(X_train) X_test = sc_X.fit_transform(X_test)
由於我們的特徵不止一個維度,每個維度之間沒有同一個刻度,會導致兩個維度之間的數據差距特別大。可能一個維度的數據是0.1,0.2這種小於1的數字;而另一個維度是1000,2000這種非常大的數字。因此,我們需要給特徵縮放,讓他們都在同一個尺度,方便後面進行模型計算。
如果你喜歡本文,請分享到朋友圈,想要獲得更多資訊,請關注我。