2.資料及其預處理

2022-06-19 18:03:25

1. 資料樣本矩陣

一般資料集的構造形式:一行一樣本,一列一特徵,以下為一個範例

姓名 年齡 性別 工作經驗 月薪
A 22 2 5000
B 23 3 6000
C 25 3 7000

在數學推導中,常用\(x=\{x_1,x_2,\cdots,x_p\}^T\)來表示一個樣本,用\(X=\{{x^{(1)}}^T,{x^{(2)}}^T,\cdots,{x^{(n)}}^T\}^T\)來表示資料集。

2.資料預處理及相關API

sklearn.preprocessing包中提供了一系列的關於資料預處理的工具。

import numpy as np
import sklearn.preprocessing as sp

2.1 標準化

針對於資料的每一列,都減去均值併除以標準差,來抵消掉由於量綱不同而代來的影響。

2.1.1 scale

raw_sample=np.array([
    [17,100,4000],
    [20,80,5000],
    [23,75,5000]
])
std_sample=sp.scale(raw_sample)
print(std_sample)
[[-1.22474487  1.38873015 -1.41421356]
 [ 0.         -0.46291005  0.70710678]
 [ 1.22474487 -0.9258201   0.70710678]]

2.1.2 StandardScaler

scale相比,使用StandardScaler類類的好處在於:

  1. 可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料,
  2. 它可以當作一個學習器放在Pipline管道中。
ss=sp.StandardScaler()
ss.fit(raw_sample)# 按原始訓練集生成規則,即訓練的均值和標準差
std_sample=ss.transform(raw_sample)  # 講規則應用到樣本中
test_sample=np.array([
    [20,80,3000],
    [21,88.2500]
])
std_test_sample=ss.transform(test_sample)#將規則應用到測試集中
#也可以將按原始訓練集生成規則和將規則應用到原始資料的過程合併為一步
std_sample=ss.fit_transform(raw_sample)

對於其他形式的資料預處理工具,一般的使用方法(fit,transform,fit_transform)都相同。

2.2 範圍縮放

將樣本矩陣中每一列的的等比例縮放到相同的區間,一般是[0,1]區間。
對於每列資料\(x=\{x_1,x_2,x_3,x_4,\cdots,x_n\}\),

\[ x_i^{*}=\frac{x_i-\min\{x\}}{\max\{x\}-\min\{x\}} \]

mms=sp.MinMaxScaler(feature_range=(0,1))
mms.fit_transform(raw_sample)
array([[0. , 1. , 0. ],
       [0.5, 0.2, 1. ],
       [1. , 0. , 1. ]])

2.3 歸一化

有時候每個樣本的每個特徵具體的值不重要,但是每個樣本特徵值的佔比很重要。

姓名 動畫片 劇情片 動作片 喜劇片
A 20 4 50 1
B 10 1000 200 6000
C 80 20 20000 50

假設一個視訊網站,A是新註冊的會員,BC是老會員,因此在衡量樣本相似度(愛好相似)時不能單純考慮數量,而是考慮每種類中所佔的比例。

歸一化就是將每個樣本縮放到單位範數(每個樣本的範數為 1)。

其思想原理是: 對每個樣本計算其p-範數,然後對該樣本中每個元素除以該範數,這樣處理的結果是是的每個處理後樣本的 p-範數(L1-norm, L2-norm)等於 1。

raw_sample=np.array([
    [20,4,50,1],
    [10,1000,200,6000],
    [80,20,20000,50]
])
normalized_sample = sp.normalize(raw_sample, norm='l1')
print(normalized_sample)
[[0.26666667 0.05333333 0.66666667 0.01333333]
 [0.00138696 0.13869626 0.02773925 0.83217753]
 [0.00397022 0.00099256 0.99255583 0.00248139]]

2.4 二值化

特徵二值化是將數值特徵用閾值過濾得到布林值的過程。即,給定閾值,將特徵轉換為 0/1,一般用於影象中。

import matplotlib.pyplot as plt
raw_image=np.random.uniform(low=0,high=255,size=(28,28))
plt.imshow(raw_image,cmap="gray")

bin=sp.Binarizer(threshold=100)
plt.imshow(bin.fit_transform(raw_image),cmap="gray")

2.5 標籤編碼和獨熱編碼

真實世界的資料集通常都含有非數值型的變數,例如人的性別,在分類任務中,標籤通常也是非數值型的變數。

許多機器學習庫要求類別是整型數值。雖然sklearn中大部分學習器都能自動將類別轉為整型,但還是建議手動將類別進行轉換。對類別進行編碼。

label=np.array(
    ["男","女","女","男"]
)
le=sp.LabelEncoder()
label_encoder=le.fit_transform(label)
label_encoder
array([1, 0, 0, 1])
#也可以將新的標籤編碼安原來的規則轉換為原始文字
le.inverse_transform([0,1,1,0,1])
array(['女', '男', '男', '女', '男'], dtype='<U1')

假設一個四分類分類任務,其標籤分別為1,2,3,4,現在將其每個標籤轉換為概率值的形式。

ohe=sp.OneHotEncoder()
ohe.fit_transform(label_encoder.reshape(-1,1)).toarray()
array([[0., 1.],
       [1., 0.],
       [1., 0.],
       [0., 1.]])

3 sklearn中的資料集

SKLearn裡面有很多自帶資料集供使用者使用,sklearn.datasets專門用來獲取資料集的模組。

根據資料集的形式,獲取方式分為以下幾種:

  • 自帶的小資料集(packaged dataset):sklearn.datasets.load_*
  • 可線上下載的資料集(Downloaded Dataset):sklearn.datasets.fetch_*
  • 計算機生成的資料集(Generated Dataset):sklearn.datasets.make_*
  • svmlight/libsvm格式的資料集:sklearn.datasets.load_svmlight_file(...)
  • 從買了data.org線上下載獲取的資料集:sklearn.datasets.fetch_mldata(...)
sklearn.datasets.load_*
  • *代表資料集的名稱,可以通過Tab鍵列出可支援的資料集
  • 資料集明細
資料集 介紹
load_wine 葡萄酒資料集
load_iris 鳶尾花資料集
load_boston 波士頓房屋資料集
load_breast_cancer 乳腺癌資料集
load_diabetes 糖尿病資料集
load_linnerud 體能訓練資料集
load_digits 手寫體資料集

下面以load_iris()為例:
load_iris():

  • 引數:
  • as_frame:bool,default=false,決定返回的資料型別是pandas.DataframeSeries還是numpy.ndarray(預設)
  • return_X_y:bool,default=false,預設返回的是sklearn.utils.Bunch物件,它是對字典物件的繼承,通過.keys()方法可以檢視有那些鍵,通過對應的鍵檢視關鍵資訊。如果不需要這些資訊,可以設為true,以元組的形式返回資料和標籤。
from sklearn import datasets

*#匯入資料集*

iris=datasets.load_iris()

*#可以把資料集看作一個字典,檢視資料集中的鍵*

iris.keys()

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

屬性 介紹
data 資料,一行一樣本,一列一特徵,根據 as_frame決定什麼型別
target 資料標籤,根據 as_frame決定什麼型別
frame 當as_frame為True是才返回內容
target_names 標籤類別名
DESCR 對資料集的描述
feature_names 每個特徵對應的名稱
filename 資料集所在的檔名
data_module 資料集所在的模組

4.劃分訓練集和測試集

sklearn.model_selection中提供的train_test_split()方法來切分訓練集和測試集

  • 引數:
  • X:資料
  • y:標籤
  • test_size:float or int, default=None,可以設定0到1之間的數,做為測試集的比例,也可以是整數,作為測試集的樣本數,若果設定為default。則為0.25。
  • train_size:訓練集樣本數的設定,同上,一般只設定test_size即可,不需要設定概引數
  • random_state:int, RandomState instance or None, default=None,隨機種子
  • shufflebool, default=True,是否打亂
  • 具體使用:

  •   from sklearn.model_selection import train_test_split
      X=iris.data
      y=iris.target
      X_train, X_test, y_train, y_test =train_test_split(X, y, random_state=2022,test_size=0.2, shuffle=True)