機器學習篇(二)

  • 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:嶺回歸