【機器學習演算法】KNN鳶尾花種類預測案例和特徵預處理。全md文件筆記(已分享,附程式碼)

發表於2024-02-26

本系列文章md筆記(已分享)主要討論機器學習演算法相關知識。機器學習演算法文章筆記以演算法、案例為驅動的學習,伴隨淺顯易懂的數學知識,讓大家掌握機器學習常見演算法原理,應用Scikit-learn實現機器學習演算法的應用,結合場景解決實際問題。包括K-近鄰演算法,線性迴歸,邏輯迴歸,決策樹演算法,整合學習,聚類演算法。K-近鄰演算法的距離公式,應用LinearRegression或SGDRegressor實現迴歸預測,應用LogisticRegression實現邏輯迴歸預測,應用DecisionTreeClassifier實現決策樹分類,應用RandomForestClassifie實現隨機森林演算法,應用Kmeans實現聚類任務。

全套筆記和程式碼自取移步gitee倉庫: gitee倉庫獲取完整文件和程式碼

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~


共 7 章,44 子模組

K-近鄰演算法

學習目標

  • 掌握K-近鄰演算法實現過程
  • 知道K-近鄰演算法的距離公式
  • 知道K-近鄰演算法的超引數K值以及取值問題
  • 知道kd樹實現搜尋的過程
  • 應用KNeighborsClassifier實現分類
  • 知道K-近鄰演算法的優缺點
  • 知道交叉驗證實現過程
  • 知道超引數搜尋過程
  • 應用GridSearchCV實現演算法引數的調優

1.6 案例:鳶尾花種類預測--資料集介紹

本實驗介紹了使用Python進行機器學習的一些基本概念。 在本案例中,將使用K-Nearest Neighbor(KNN)演算法對鳶尾花的種類進行分類,並測量花的特徵。

本案例目的:

  1. 遵循並理解完整的機器學習過程
  2. 對機器學習原理和相關術語有基本的瞭解。
  3. 瞭解評估機器學習模型的基本過程。

1 案例:鳶尾花種類預測

Iris資料集是常用的分類實驗資料集,由Fisher, 1936收集整理。Iris也稱鳶尾花卉資料集,是一類多重變數分析的資料集。關於資料集的具體介紹:

2 scikit-learn中資料集介紹

2.1 scikit-learn資料集API介紹

  • sklearn.datasets

    • 載入獲取流行資料集
    • datasets.load_*()

      • 獲取小規模資料集,資料包含在datasets裡
    • datasets.fetch_*(data_home=None)

      • 獲取大規模資料集,需要從網路上下載,函式的第一個引數是data_home,表示資料集下載的目錄,預設是 ~/scikit_learn_data/
2.1.1 sklearn小資料集
  • sklearn.datasets.load_iris()

載入並返回鳶尾花資料集

img

2.1.2 sklearn大資料集
  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

    • subset:'train'或者'test','all',可選,選擇要載入的資料集。
    • 訓練集的“訓練”,測試集的“測試”,兩者的“全部”

2.2 sklearn資料集返回值介紹

  • load和fetch返回的資料型別datasets.base.Bunch(字典格式)

    • data:特徵資料陣列,是 [n_samples * n_features] 的二維 numpy.ndarray 陣列
    • target:標籤陣列,是 n_samples 的一維 numpy.ndarray 陣列
    • DESCR:資料描述
    • feature_names:特徵名,新聞資料,手寫數字、迴歸資料集沒有
    • target_names:標籤名
from sklearn.datasets import load_iris
  
  
# 獲取鳶尾花資料集
  
  
iris = load_iris()
print("鳶尾花資料集的返回值:\n", iris)
  
  
# 返回值是一個繼承自字典的Bench
  
  
print("鳶尾花的特徵值:\n", iris["data"])
print("鳶尾花的目標值:\n", iris.target)
print("鳶尾花特徵的名字:\n", iris.feature_names)
print("鳶尾花目標值的名字:\n", iris.target_names)
print("鳶尾花的描述:\n", iris.DESCR)

2.3 檢視資料分佈

透過建立一些圖,以檢視不同類別是如何透過特徵來區分的。 在理想情況下,標籤類將由一個或多個特徵對完美分隔。 在現實世界中,這種理想情況很少會發生。

  • seaborn介紹

    • Seaborn 是基於 Matplotlib 核心庫進行了更高階的 API 封裝,可以讓你輕鬆地畫出更漂亮的圖形。而 Seaborn 的漂亮主要體現在配色更加舒服、以及圖形元素的樣式更加細膩。
    • 安裝 pip3 install seaborn
    • seaborn.lmplot() 是一個非常有用的方法,它會在繪製二維散點圖時,自動完成迴歸擬合

      • sns.lmplot() 裡的 x, y 分別代表橫縱座標的列名,
      • data= 是關聯到資料集,
      • hue=*代表按照 species即花的類別分類顯示,
      • fit_reg=是否進行線性擬合。
    • 參考連結: api連結
%matplotlib inline  
  
  
# 內嵌繪圖
  
  
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

  
  
# 把資料轉換成dataframe的格式
  
  
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target

def plot_iris(iris, col1, col2):
    sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('鳶尾花種類分佈圖')
    plt.show()
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')

image-20190225193311519

2.4 資料集的劃分

機器學習一般的資料集會劃分為兩個部分:

  • 訓練資料:用於訓練,構建模型
  • 測試資料:在模型檢驗時使用,用於評估模型是否有效

劃分比例:

  • 訓練集:70% 80% 75%
  • 測試集:30% 20% 25%

資料集劃分api

  • sklearn.model_selection.train_test_split(arrays, *options)

    • x 資料集的特徵值
    • y 資料集的標籤值
    • test_size 測試集的大小,一般為float
    • random_state 隨機數種子,不同的種子會造成不同的隨機取樣結果。相同的種子取樣結果相同。
    • return 測試集特徵訓練集特徵值值,訓練標籤,測試標籤(預設隨機取)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
  
  
# 1、獲取鳶尾花資料集
  
  
iris = load_iris()
  
  
# 對鳶尾花資料集進行分割
  
  
  
  
# 訓練集的特徵值x_train 測試集的特徵值x_test 訓練集的目標值y_train 測試集的目標值y_test
  
  
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
print("x_train:\n", x_train.shape)
  
  
# 隨機數種子
  
  
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果隨機數種子不一致:\n", x_train == x_train1)
print("如果隨機數種子一致:\n", x_train1 == x_train2)

1.7 特徵工程-特徵預處理

1 什麼是特徵預處理

1.1 特徵預處理定義

scikit-learn的解釋

provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

翻譯過來:透過一些轉換函式將特徵資料轉換成更加適合演算法模型的特徵資料過程

ç¹å¾é¢å¤çå¾

為什麼我們要進行歸一化/標準化?
  • 特徵的單位或者大小相差較大,或者某特徵的方差相比其他的特徵要大出幾個數量級容易影響(支配)目標結果,使得一些演算法無法學習到其它的特徵
舉例:約會物件資料

约ä¼å¯¹è±¡æ°æ®

我們需要用到一些方法進行無量綱化使不同規格的資料轉換到同一規格

1.2 包含內容(數值型資料的無量綱化)

  • 歸一化
  • 標準化

1.3 特徵預處理API

sklearn.preprocessing

2 歸一化

2.1 定義

透過對原始資料進行變換把資料對映到(預設為[0,1])之間

2.2 公式

å½ä¸å公å¼

作用於每一列,max為一列的最大值,min為一列的最小值,那麼X’’為最終結果,mx,mi分別為指定區間值預設mx為1,mi為0

那麼怎麼理解這個過程呢?我們透過一個例子

å½ä¸å计ç®è¿ç¨

2.3 API

  • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )

    • MinMaxScalar.fit_transform(X)

      • X:numpy array格式的資料[n_samples,n_features]
    • 返回值:轉換後的形狀相同的array

2.4 資料計算

我們對以下資料進行運算,在dating.txt中。儲存的就是之前的約會物件資料

milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
  • 分析

1、例項化MinMaxScalar

2、透過fit_transform轉換

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

def minmax_demo():
    """
    歸一化演示
    :return: None
    """
    data = pd.read_csv("dating.txt")
    print(data)
    # 1、例項化一個轉換器類
    transfer = MinMaxScaler(feature_range=(2, 3))
    # 2、呼叫fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("最小值最大值歸一化處理的結果:\n", data)

    return None

返回結果:

milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
3     75136  13.147394    0.428964       1
..      ...        ...         ...     ...
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3

[1000 rows x 4 columns]
最小值最大值歸一化處理的結果:
 [[ 2.44832535  2.39805139  2.56233353]
 [ 2.15873259  2.34195467  2.98724416]
 [ 2.28542943  2.06892523  2.47449629]
 ..., 
 [ 2.29115949  2.50910294  2.51079493]
 [ 2.52711097  2.43665451  2.4290048 ]
 [ 2.47940793  2.3768091   2.78571804]]
問題:如果資料中異常點較多,會有什麼影響?

å¼å¸¸ç¹å¯¹å½ä¸åå½±å

2.5 歸一化總結

注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小資料場景。

怎麼辦?

3 標準化

3.1 定義

透過對原始資料進行變換把資料變換到均值為0,標準差為1範圍內

3.2 公式

æ åå公å¼

作用於每一列,mean為平均值,σ為標準差

所以回到剛才異常點的地方,我們再來看看標準化

  • 對於歸一化來說:如果出現異常點,影響了最大值和最小值,那麼結果顯然會發生改變
  • 對於標準化來說:如果出現異常點,由於具有一定資料量,少量的異常點對於平均值的影響並不大,從而方差改變較小。

3.3 API

  • sklearn.preprocessing.StandardScaler( )

    • 處理之後每列來說所有資料都聚集在均值0附近標準差差為1
    • StandardScaler.fit_transform(X)

      • X:numpy array格式的資料[n_samples,n_features]
    • 返回值:轉換後的形狀相同的array

3.4 資料計算

同樣對上面的資料進行處理

  • 分析

1、例項化StandardScaler

2、透過fit_transform轉換

import pandas as pd
from sklearn.preprocessing import StandardScaler

def stand_demo():
    """
    標準化演示
    :return: None
    """
    data = pd.read_csv("dating.txt")
    print(data)
    # 1、例項化一個轉換器類
    transfer = StandardScaler()
    # 2、呼叫fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("標準化的結果:\n", data)
    print("每一列特徵的平均值:\n", transfer.mean_)
    print("每一列特徵的方差:\n", transfer.var_)

    return None

返回結果:

milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
..      ...        ...         ...     ...
997   26575  10.650102    0.866627       3
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3

[1000 rows x 4 columns]
標準化的結果:
 [[ 0.33193158  0.41660188  0.24523407]
 [-0.87247784  0.13992897  1.69385734]
 [-0.34554872 -1.20667094 -0.05422437]
 ..., 
 [-0.32171752  0.96431572  0.06952649]
 [ 0.65959911  0.60699509 -0.20931587]
 [ 0.46120328  0.31183342  1.00680598]]
每一列特徵的平均值:
 [  3.36354210e+04   6.55996083e+00   8.32072997e-01]
每一列特徵的方差:
 [  4.81628039e+08   1.79902874e+01   2.46999554e-01]

3.5 標準化總結

在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大資料場景。

未完待續, 同學們請等待下一期

全套筆記和程式碼自取移步gitee倉庫: gitee倉庫獲取完整文件和程式碼

感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~

相關文章