一般資料集的構造形式:一行一樣本,一列一特徵,以下為一個範例
姓名 | 年齡 | 性別 | 工作經驗 | 月薪 |
---|---|---|---|---|
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\)來表示資料集。
API
sklearn.preprocessing
包中提供了一系列的關於資料預處理的工具。
import numpy as np
import sklearn.preprocessing as sp
針對於資料的每一列,都減去均值併除以標準差,來抵消掉由於量綱不同而代來的影響。
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]]
StandardScaler
和scale
相比,使用StandardScaler
類類的好處在於:
- 可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料,
- 它可以當作一個學習器放在
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
)都相同。
將樣本矩陣中每一列的的等比例縮放到相同的區間,一般是[0,1]區間。
對於每列資料\(x=\{x_1,x_2,x_3,x_4,\cdots,x_n\}\),
mms=sp.MinMaxScaler(feature_range=(0,1))
mms.fit_transform(raw_sample)
array([[0. , 1. , 0. ],
[0.5, 0.2, 1. ],
[1. , 0. , 1. ]])
有時候每個樣本的每個特徵具體的值不重要,但是每個樣本特徵值的佔比很重要。
姓名 | 動畫片 | 劇情片 | 動作片 | 喜劇片 |
---|---|---|---|---|
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]]
特徵二值化是將數值特徵用閾值過濾得到布林值的過程。即,給定閾值,將特徵轉換為 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")
真實世界的資料集通常都含有非數值型的變數,例如人的性別,在分類任務中,標籤通常也是非數值型的變數。
許多機器學習庫要求類別是整型數值。雖然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.]])
sklearn
中的資料集SKLearn裡面有很多自帶資料集供使用者使用,sklearn.datasets
專門用來獲取資料集的模組。
根據資料集的形式,獲取方式分為以下幾種:
sklearn.datasets.load_*
sklearn.datasets.fetch_*
sklearn.datasets.make_*
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.Dataframe
或Series
還是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 | 資料集所在的模組 |
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)