1.特征工程預(yù)處理
即進(jìn)行歸一化/標(biāo)準(zhǔn)化
為什么要進(jìn)行歸一化/標(biāo)準(zhǔn)化?
特征的單位或者大小相差較大,或者某特征的方差相比其他的特征要大出幾個數(shù)量級,容易影響(支配)目標(biāo)結(jié)果,使得一些算法無法學(xué)習(xí)到其它的特征
但是,一般使用標(biāo)準(zhǔn)化,歸一化只適合傳統(tǒng)精確小數(shù)據(jù)場景。
標(biāo)準(zhǔn)化
通過對原始數(shù)據(jù)進(jìn)行變換把數(shù)據(jù)變換到均值為0,標(biāo)準(zhǔn)差為1范圍內(nèi)

**API**
**sklearn.preprocessing.StandardScaler( )**
處理之后每列來說所有數(shù)據(jù)都聚集在均值0附近標(biāo)準(zhǔn)差差為1
StandardScaler.fit_transform(X)
X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
返回值:轉(zhuǎn)換后的形狀相同的array
適合現(xiàn)代嘈雜大數(shù)據(jù)場景。
2.交叉驗(yàn)證、網(wǎng)格搜索
交叉驗(yàn)證:將拿到的訓(xùn)練數(shù)據(jù),分為訓(xùn)練和驗(yàn)證集。以下圖為例:將數(shù)據(jù)分成4份,其中一份作為驗(yàn)證集。然后經(jīng)過4次(組)的測試,每次都更換不同的驗(yàn)證集。即得到4組模型的結(jié)果,取平均值作為最終結(jié)果。又稱4折交叉驗(yàn)證。
交叉驗(yàn)證的目的:為了讓被評估的模型更加準(zhǔn)確可信
網(wǎng)格搜索:通常情況下,有很多參數(shù)是需要手動指定的(如k-近鄰算法中的K值),這種叫超參數(shù)。但是手動過程繁雜,所以需要對模型預(yù)設(shè)幾種超參數(shù)組合。每組超參數(shù)都采用交叉驗(yàn)證來進(jìn)行評估。最后選出最優(yōu)參數(shù)組合建立模型。
API:sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
對估計器的指定參數(shù)值進(jìn)行詳盡搜索
estimator:估計器對象
param_grid:估計器參數(shù)(dict){“n_neighbors”:[1,3,5]}
cv:指定幾折交叉驗(yàn)證
fit:輸入訓(xùn)練數(shù)據(jù)
score:準(zhǔn)確率
結(jié)果分析:
bestscore__:在交叉驗(yàn)證中驗(yàn)證的最好結(jié)果
bestestimator:最好的參數(shù)模型
cvresults:每次交叉驗(yàn)證后的驗(yàn)證集準(zhǔn)確率結(jié)果和訓(xùn)練集準(zhǔn)確率結(jié)果
3.sklearn實(shí)現(xiàn)KNN
會用到交叉驗(yàn)證和網(wǎng)格搜索
此處因?yàn)槭菍懸徊?,看一步,用的是jupyter notebook,故沒有一起導(dǎo)包
1.獲取數(shù)據(jù)集
2.數(shù)據(jù)基本處理
3.特征工程
4.機(jī)器學(xué)習(xí)(模型訓(xùn)練)
5.模型評估
#1.獲取數(shù)據(jù)集
#這里的數(shù)據(jù)為原本手寫數(shù)字識別的測試集(9999,785)
import pandas as pd
import numpy as np
data = pd.read_csv("Mnist/mnist_test.csv")
#讀進(jìn)來的數(shù)據(jù)第一列是標(biāo)簽,那就要對他進(jìn)行劃分
#讀進(jìn)來是一個DataFrame形式的數(shù)據(jù)結(jié)構(gòu)
#2.數(shù)據(jù)基本處理
#把數(shù)據(jù)劃分成兩部分,手寫數(shù)字識別的數(shù)據(jù)分布,是上述的data
#把標(biāo)簽和數(shù)據(jù)分開
#label為標(biāo)簽,data為數(shù)據(jù)
#轉(zhuǎn)換為矩陣形式
data = np.array(data)
label = data[:,0]
data = data[:,1:]
#3.特征工程
#此處特征工程的處理為,劃分7.5比2.5的訓(xùn)練集和測試集
#做標(biāo)準(zhǔn)化的處理
#訓(xùn)練集的測試集劃分的庫
from sklearn.model_selection import train_test_split
#標(biāo)準(zhǔn)化處理的庫
from sklearn.preprocessing import StandardScaler
#做出對數(shù)據(jù)集的劃分
x_train,x_test,y_train,y_test = train_test_split(data,label,test_size=0.25)
#進(jìn)行標(biāo)準(zhǔn)化處理
#實(shí)例化一個學(xué)習(xí)器
transfer = StandardScaler()
#以訓(xùn)練集x_train為訓(xùn)練標(biāo)準(zhǔn),并以這個標(biāo)準(zhǔn)去把x_test也做同樣的轉(zhuǎn)化
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#4.機(jī)器學(xué)習(xí)(模型訓(xùn)練)
#KNN的模型訓(xùn)練包
from sklearn.neighbors import KNeighborsClassifier
#實(shí)例化一個學(xué)習(xí)器
#n_neighbors為設(shè)定的鄰居數(shù)
#也就是說最后要從這9個中進(jìn)行投票表決
estimator = KNeighborsClassifier(n_neighbors=15)
#對訓(xùn)練集進(jìn)行訓(xùn)練
estimator.fit(x_train,y_train)
#5.模型評估
#對比一下真實(shí)值和預(yù)測值
y_predict = estimator.predict(x_test)
print("預(yù)測結(jié)果為:",y_predict)
print("比對真實(shí)值和預(yù)測值:",y_predict == y_test)
#直接計算準(zhǔn)確率
score = estimator.score(x_test,y_test)
print("準(zhǔn)確率為:",score)
結(jié)果
預(yù)測結(jié)果為: [6 6 3 ... 4 4 6]
比對真實(shí)值和預(yù)測值: [ True False True ... True True True]
準(zhǔn)確率為: 0.9416
#交叉驗(yàn)證、網(wǎng)格搜索,部分步驟改變一下即可
from sklearn.model_selection import GridSearchCV
#KNN的模型訓(xùn)練包
from sklearn.neighbors import KNeighborsClassifier
#實(shí)例化一個學(xué)習(xí)器
#n_neighbors為設(shè)定的鄰居數(shù)
#也就是說最后要從這9個中進(jìn)行投票表決
#估計器里不需要填寫參數(shù)n_neighbors
estimator = KNeighborsClassifier()
# 4.2 模型選擇與調(diào)優(yōu)——網(wǎng)格搜索和交叉驗(yàn)證
#準(zhǔn)備要調(diào)的超參數(shù)
param_dict = {"n_neighbors":[5,9,15]}
estimator = GridSearchCV(estimator,param_grid=param_dict,cv=3)
#對訓(xùn)練集進(jìn)行訓(xùn)練
estimator.fit(x_train,y_train)
#5.模型評估
#對比一下真實(shí)值和預(yù)測值
y_predict = estimator.predict(x_test)
print("預(yù)測結(jié)果為:",y_predict)
print("比對真實(shí)值和預(yù)測值:",y_predict == y_test)
#直接計算準(zhǔn)確率
score = estimator.score(x_test,y_test)
print("準(zhǔn)確率為:",score)
結(jié)果
預(yù)測結(jié)果為: [6 6 3 ... 4 4 6]
比對真實(shí)值和預(yù)測值: [ True False True ... True True True]
準(zhǔn)確率為: 0.9544
#查看最好的結(jié)果
estimator.best_estimator_
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=5, p=2,
weights='uniform')