機器學習篇(二)
- 2019 年 10 月 6 日
- 筆記
目的:方便我們下一步的處理。
數值類數據:縮放:歸一化,標準化,缺失值處理
類別型數據:one-hot編碼
時間類型:時間的切分
歸一化
什麼是歸一化?
為了數據處理的方便和提取,把數據映射成0-1之間的數,更加方便。
歸一化的公式:x1 = (x-mix)/(max-min) x2 = x1*(mx-mi) + mi
# 作用於每一列,max為一列的最大值,min為一列的最小值,mx,mi為指定區間值默認mx為1,mi為0
# x2 為最終結果。使用默認值x1就為最終結果。
什麼時候用到歸一化?
當某些特徵同等重要的時候,但是數值差別很大,會進行歸一化處理。
目的:來使之不受某一個特徵的影響過大。
缺點:對於異常點比如有個點更大更小,便宜過大,會影響較大。
歸一化實例:
# 歸一化處理
# 導入歸一化模組MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
def mm():
# 實例化
mm = MinMaxScaler()
data = mm.fit_transform([[123,222,2,54],[70,60,10,99],[65,40,30,23]])
print(data)
會輸出:
[[1. 1. 0. 0.40789474]
[0.0862069 0.10989011 0.28571429 1. ]
[0. 0. 1. 0. ]]
如果想讓他顯示不在0-1之間,而是在2,5之間:
# 實例化修改成:
mm = MinMaxScaler(feature_range=(2,5))
# 根據數值的大小,對應生成某個區間對應值的大小。
標準化
由於歸一化對異常值的處理不好,所以不常用
使用最廣泛的就是標準化。標準化就是在歸一化的基礎上對異常值的處理較好。
特點:通過原始數據進行變換到均值為0,方差為1範圍。
x = x-mean/標準差
# 作用於每一列,mean為平均值。標準差這裡不好寫,自己百度一下就好。
標準差實例:
# 導入標準差模組StandardScaler
from sklearn.preprocessing import MinMaxScaler,StandardScaler
# 標準差處理
def stand():
std = StandardScaler()
data = std.fit_transform([[123,222,2,54],[70,60,10,99],[65,40,30,23]])
print(data)
輸出:
[[ 1.40992884 1.40709714 -1.01904933 -0.14956377]
[-0.60969896 -0.58083661 -0.33968311 1.29265832]
[-0.80022988 -0.82626053 1.35873244 -1.14309455]]
# 標準化常用於數據多且雜的情況下。
缺失值的處理
1、刪除,整行或者整列的刪除(數據來之不易,不建議)
2、填補,根據實際情況的不同,填充平均值,中位數等值(一般按照列來填充)
sklearn提供的填充模組:sklearn.preprocessing.Imputer
使用:imputer(missing_values="NaN",strategy="mean",axis=0)
missing_values:缺失值的位置
strategy:填充什麼值,mean表示平均數
axis:更具0軸還是1軸填充值
實例:
# 導入模組
from sklearn.preprocessing import Imputer
import numpy as np
def Im():
im = imputer(missing_values="NaN",strategy="mean",axis=0)
data = im.fit_transform([[123,np.nan,2,54],[np.nan,60,10,99],[65,40,30,23]])
print(data)
輸出:
[[123. 50. 2. 54.]
[ 94. 60. 10. 99.]
[ 65. 40. 30. 23.]]
數據的降維
降維:特徵的數量(不是數組的維度)
比如有身高,體重,頭髮長度這三個特徵,就是三維。
將三維變成二維就是降維處理。
為什麼要降維?
有些不重要影響不大的數據我們可以選擇不要。
降維的方式:
1、特徵選擇
2、主成分分析
特徵選擇:
如果特徵過多,幾千個特選不可能人為的選擇。這裡就要藉助其他工具。
常用特徵處理:
1、Fileter:過濾
# 對方差進行過濾,方差小的,說明數值相差不大,也就是特徵大致相同,就選擇過濾掉。
2、Embedded:嵌入式(正則化,決策樹)後面講
3、神經網路
特徵選擇實例:
def var():
# 數據
test = [[2,4,6],[3,4,8],[6,4,9]]
# threshold=0.0表示把一樣的數據刪除,默認也是刪除方差為0的
v = VarianceThreshold(threshold=0.0)
data = v.fit_transform(test)
print(data)
# VarianceThreshold你可以自己修改,修改成1.0就刪除方差小於1.0的數據。
主成分分析(PCA)
PCA:分析,簡化數據集的技術
目的:對數據維度進行壓縮,減少原數據的維度,損失的數據較少
應用場景:特徵數量達到上百個就需要考慮一下了。
用低維度表示高緯度的東西但損失較少的數據,結合實際,最常見的就是畫出的立體圖。
公式:百度一下,有興趣的也可以看一下推導式。
PCA實例:
# 導入模組
from sklearn.decomposition import PCA
def pca():
test = [[2,4,6],[3,4,8],[6,4,9]]
pca = PCA(n_components=0.99)
data = pca.fit_transform(test)
print(data)
輸出:
[[-2.32318647 -0.39794495]
[-0.35170213 0.65716145]
[ 2.6748886 -0.25921649]]
# 變成了2個特徵的。
# n_components參數可以是小數也可以是整數
# 小數表示要保存%之多少的數據
# 整數表示去掉多少數據
數據集的劃分
拿到很多數據,不會將他全部用來訓練模型。
把數據分為兩部分:訓練集和測試集
一般70%,30%,或75%,25%或80%,20%。
訓練集就是幫助我們建立模型,而測試集就是評估模型。
sklearn給我們提供了劃分數據的模組:sklearn.model_selection.train_test_split
同時sklearn也提供給了學習使用的數據:
skliearn.datasets模組
datasets.load_xxx():提供給我們小規模數據
datasets.fetch_xxx(data_home=None):大規模數據
# 這裡xxx表示不同的數據集。
# data_home表示需要下載的路徑
返回的數據都是datasets.base.Bunch類型(也就是字典格式)
屬性:
data:獲取特徵數據數組,是一個多行多列的二維數組(類型為numpy.ndarray)
target:標籤,一維數組(也就是目標值)
DESCR:數據描述
deature_names:特徵名(有些數據集沒有)
target_names:標籤名
實例:
# 導入鳶尾花數據集(4個花的特徵,3中類別,150個樣本數據,每個類別數量50個)
from sklearn.datasets import load_iris
# 導入劃分訓練集和評估集模組
from sklearn.model_selection import train_test_split
def Iris():
# 獲取到數據集
l = load_iris()
# 輸出特徵值
print(l.data)
# 輸出目標值
print(l.target)
# 輸出數據集詳情(什麼特徵,什麼類別等)
print(l.DESCR)
# 獲取特徵名
print(l.feature_names)
# 獲取目標值名稱
print(l.target_names)
# 劃分數據集
# 返回數據的順序為訓練集的特徵值,測試集的特徵值,訓練集的特徵值,訓練集的目標值,測試集的目標值
# 依次起名為:x_train,x_test,y_train,y_test(不能改變順序)
# 第一個參數為數據,第二個參數為目標值,第三個為測試集大小。
x_train,x_test,y_train,y_test = train_test_split(l.data,l.target,test_size=0.25)
print("訓練集數據和目標值:",x_train,y_train)
# 在sklearn還有其他數據,比如load_diabetes()是糖尿病數據集。
# 對於大數據集這裡就不慌介紹了,下載速度比較慢。
轉換器和估計器
轉換器
回想特徵工程的步驟.
1、實例化(轉換器)
2、調用fit_transform()轉化成數據集
其實在其中還有兩個方法,fit()和transform(),很像把fit_transform拆分開了。
實際fit_transform() = fit()+ transform()
fit():輸入數據,但是不做轉化,但是他提前做了計算平均值等。
transform():進行數據的轉化。
為什麼拆開?
轉換成數據集的時候是根據平均值,方差等等計算轉化的。
但是如果我不想用這個數據集的平均值和方差來轉化。想用其他的數據的平均值和方差來計算呢?
此時就需要拆開處理了。
比如:
標準化處理:
from sklearn.preprocessing import StandardScaler
std = StandardScaler()
data1 = std.fit([[111,222,333],[444,555,666]])
data2 = std.transform([[11,22,33],[44,55,66]])
此時也就是用來data1中的平均值和方差等來轉化data2中的數據。
估計器
估計器就是一些演算法的實現。
分類演算法:
sklearn.neighbors:k-近鄰演算法
sklearn.naive_bayes:貝葉斯演算法
sklearn.linear_model.LogisticRegression:邏輯回歸
sklearn.tree:決策樹和隨機森林
回歸演算法:
sklearn.linear_model.LinearRegression:線性回歸
sklearn.linear_model.Ridge:嶺回歸