[機器學習]-[數據預處理]-中心化 縮放 KNN(二)

上次咱們使用精度評估獲得的成績是 61%,成績並不理想,再使 recall 和 f1 看下成績如何?html

首先咱們先了解一下 召回率和 f1。算法

真實結果數組

預測結果dom

預測結果機器學習

 

正例函數

反例學習

正例測試

TP 真正例spa

FN 假反例code

反例

FP 假正例

TN 真反例

召回率:TP/(TP+FN)

f1:2TP/(2TP+FN+FP)

咱們使用scikit-learn的分類報告來查看各類其餘指標:

如今咱們來介紹一下縮放和中心化,他們是預處理數值數據最基本的方法,接下來,看看它們是否對模型有影響,以及怎樣的影響。

預處理的機制:縮放和中心化

在運行模型(如迴歸(預測連續變量)或分類(預測離散變量))以前,咱們仍是須要對數據進行一些預處理。對於數值變量,規範化標準化數據是很常見的。這些術語是什麼意思?

規範化手段就是縮放數據集,使其數據取值的範圍壓縮到0,1。咱們的作法就是轉換每一個數據點:規範化結果=(數據點-數據最小值)/(數據最大值-數據最小值)。

標準化則略有不一樣, 它的最終結果就是將數據集中在0左右,並按照標準誤差進行縮放:標準化結果=(數據點-均值)/標準差。

有一點須要強調,這些轉換隻是改變了數據的範圍而不是分佈。固然,你也能夠根據本身的須要使用其餘的轉換方式(如對數轉換換或正太轉換)來達到數據的高斯分佈形式(如鐘形曲線)。

如今咱們思考幾個重要的問題:

  • 爲何咱們要調整數據?
  • 什麼時機處理更合適?
  • 分類問題和迴歸問題哪一個更重要?

下面咱們就具體看下縮放對 KNN 的影響。

預處理:縮放的預處理

下面是咱們的處理步驟

  1. 縮放數據
  2. 使用 KNN
  3. 查看模型結果

使用scikit-learn的縮放函數,它會將傳給它的數組中全部的特徵(列)標準化。

經過上面的處理以後提升了0.1,這就說明預處理的很成功,同時也說明預處理很重要!!!如上所述,在縮放以前,存在許多具備不一樣數量級範圍的預測變量,這意味着它們中的某一個或幾個可能在,如 KNN 算法處理中占主導地位。縮放數據的通常是基於如下兩個緣由:

  1. 預測變量可能有明顯不一樣的範圍,而且在某些狀況下(例如使用 KNN),須要削弱某些特徵對算法的主導;
  2. 功能與單位無關,即不依賴於所涉及的規模:例如,我使用米來表示測量的特徵,你使用釐米來表示相同的特徵。若是咱們都縮放各自的數據,那麼,這個特徵對咱們每一個人都是同樣的。

到目前位置,咱們已經瞭解了縮放和中心化在整個機器學習中的基本位置,咱們這樣作主要的目的就是提升機器學習的學習能力。我但願後續,我能和你們分享一些其餘類型的預處理。在進入這個以前,在下一篇文章中,我將探討縮放在迴歸分類方法中的做用。

最後,有興趣的同窗能夠自行設置 KNN 的 n_neighbors 變量,而後觀察一下 n_neighbors 對機器學習的影響。

代碼:

import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
#from sklearn.cross_validation import train_test_split
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn import neighbors, linear_model

plt.style.use('ggplot')
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv ' , sep = ';')

# 刪除目標結果
X = df.drop('quality' , 1).values
y1 = df['quality'].values
pd.DataFrame.hist(df, figsize = [15,15]);

df.describe()

# 使用 5 做爲邊界進行分類
y = y1 <= 5

# 原始目標結果和二分類以後的目標結果
plt.figure(figsize=(20,5));
plt.subplot(1, 2, 1 );
plt.hist(y1);
plt.xlabel('original target value')
plt.ylabel('count')
plt.subplot(1, 2, 2);
plt.hist(y)
plt.xlabel('two-category target value')
plt.show()

# 切分測試數據與訓練數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

knn = neighbors.KNeighborsClassifier(n_neighbors = 5)
knn_model_1 = knn.fit(X_train, y_train)
print('k-NN accuracy: {}'.format(knn_model_1.score(X_test, y_test)))

# 其餘評估評分
y_true, y_pred = y_test, knn_model_1.predict(X_test)
print(classification_report(y_true, y_pred))

# 預處理數據
Xs = scale(X)

# 切分測試數據與訓練數據
Xs_train, Xs_test, y_train, y_test = train_test_split(Xs, y, test_size=0.2, random_state=42)

# 能夠經過設置 n_neighbors 來進行訓練
knn = neighbors.KNeighborsClassifier(n_neighbors = 5)
knn_model_2 = knn.fit(Xs_train, y_train)
print('k-NN test: %f' % knn_model_2.score(Xs_test, y_test))
print('k-NN training: %f' % knn_model_2.score(Xs_train, y_train))
y_true, y_pred = y_test, knn_model_2.predict(Xs_test)
print(classification_report(y_true, y_pred))

知乎:數據預處理-中心化 縮放 KNN(二)

雲+社區:[機器學習]-[數據預處理]-中心化 縮放 KNN(二)

相關文章
相關標籤/搜索