【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集
各位同學好,今天我向大家介紹一下python機器學習中的K近鄰算法。內容有:K近鄰算法的原理解析;實戰案例--紅酒分類預測。紅酒數據集、完整代碼在文章最下面。
案例簡介:有178個紅酒樣本,每一款紅酒含有13項特征參數,如鎂、脯氨酸含量,紅酒根據這些特征參數被分成3類。要求是任意輸入一組紅酒的特征參數,模型需預測出該紅酒屬于哪一類。
1. K近鄰算法介紹
1.1 算法原理
? ? ? ?原理:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數屬于某一個類別,那么該樣本也屬于這個類別。簡單來說就是,求兩點之間的距離,看距離誰是最近的,以此來區分我們要預測的這個數據是屬于哪個分類。
? ? ? ?我們看圖來理解一下。藍色點是屬于a類型的樣本點,粉色點是屬于b類型的樣本點。此時新來了一個點(黃色點),怎么判斷是屬于它是a類型還是b類型呢。
? ? ? ? 方法是:新點找距離自身最近的k個點(k可變)。分別計算新點到其他各個點的距離,按距離從小到大排序,找出距離自身最近的k個點。統計在這k個點中,有多少點屬于a類,有多少點屬于b類。在這k個點中,如果屬于b類的點更多,那么這個新點也屬于b分類。距離計算公式也是我們熟悉的勾股定理。?
?
1.2 算法優缺點
算法優點:簡單易理解、無需估計參數、無需訓練。適用于幾千-幾萬的數據量。
算法缺點:對測試樣本計算時的計算量大,內存開銷大,k值要不斷地調整來達到最優效果。k值取太小容易受到異常點的影響,k值取太多產生過擬合,影響準確性。
2. 紅酒數據集
2.1 數據集獲取方式
? ? ? ?紅酒數據集是Scikit-learn庫中自帶的數據集,我們只需要直接調用它,然后打亂它的順序來進行我們自己的分類預測。首先我們導入Scikit-learn庫,如果大家使用的是anaconda的話,這個庫中的數據集都是提前安裝好了的,我們只需要調用它即可。
找不到這個數據集的,我把紅酒數據集連接放在文末了,有需要的自取。
Scikit-learn數據集獲取方法:
(1)用于獲取小規模數據集,數據集已在系統中安裝好了的
sklearn.datasets.load_數據名() ?
from sklearn import datasets
#系統中已有的波士頓房價數據集
boston = datasets.load_boston()
(2)遠程獲取大規模數據集安裝到本地,data_home默認是位置是/scikit_learn_data/
sklearn.datasets.fetch_數據名(data_home = 數據集下載目錄) ?
# 20年的新聞數據下載到
datasets.fetch_20newsgroups(data_home = './newsgroups.csv') #指定文件位置
這兩種方法返回的數據是?.Bunch類型,它有如下屬性:
data:特征數據二維數組;相當于x變量
target:標簽數組;相當于y變量
DESCR:數據描述
feature_names:特征名。新聞數據、手寫數據、回歸數據沒有
target_name:標簽名?;貧w數據沒有
想知道還能獲取哪些數據集的同學,可去下面這個網址查看具體操作:
https://sklearn.apachecn.org/#/docs/master/47
2.2 獲取紅酒數據
? ? ? ?首先導入sklearn的本地數據集庫,變量wine獲取紅酒數據,由于wine接收的返回值是.Bunch類型的數據,因此我用win_data接收所有特征值數據,它是178行13列的數組,每一列代表一種特征。win_target用來接收所有的目標值,本數據集中的目標值為0、1、2三類紅酒。如果大家想更仔細的觀察這個數據集,可以通過wine.DESCR來看這個數據集的具體描述。
? ? ? ? 然后把我們需要的數據轉換成DataFrame類型的數據。為了使預測更具有一般性,我們把這個數據集打亂。操作如下:
from sklearn import datasets
wine = datasets.load_wine() # 獲取葡萄酒數據
wine_data = wine.data #獲取葡萄酒的索引data數據,178行13列
wine_target = wine.target #獲取分類目標值# 將數據轉換成DataFrame類型
wine_data = pd.DataFrame(data = wine_data)
wine_target = pd.DataFrame(data = wine_target)# 將wine_target插入到第一列,并給這一列的列索引取名為'class'
wine_data.insert(0,'class',wine_target)# ==1== 變量.sample(frac=1) 表示洗牌,重新排序
# ==2== 變量.reset_index(drop=True) 使index從0開始排序wine = wine_data.sample(frac=1).reset_index(drop=True) #把DataFrame的行順序打亂
?
? ? ? 我們取出最后10行數據用作后續的驗證預測結果是否正確,這10組數據分出特征值(相當于x)和目標值(相當于y)。剩下的數據也分出特征值features和目標值targets,用于模型訓練。剩下的數據中還要劃分出訓練集和測試集,下面再詳述。到此,數據處理這塊完成。
#取后10行,用作最后的預測結果檢驗。并且讓index從0開始,也可以不寫.reset_index(drop=True)
wine_predict = wine[-10:].reset_index(drop=True)
# 讓特征值等于去除'class'后的數據
wine_predict_feature = wine_predict.drop('class',axis=1)
# 讓目標值等于'class'這一列
wine_predict_target = wine_predict['class']wine = wine[:-10] #去除后10行
features = wine.drop(columns=['class'],axis=1) #刪除class這一列,產生返回值
targets = wine['class'] #class這一列就是目標值
3. 紅酒分類預測
3.1 劃分測試集和訓練集
一般采用75%的數據用于訓練,25%用于測試,因此在數據進行預測之前,先要對數據劃分。
劃分方式:
使用sklearn.model_selection.train_test_split 模塊進行數據分割。
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=數據占比)
train_test_split() 括號內的參數:
x:數據集特征值(features)
y:數據集目標值(targets)
test_size: 測試數據占比,用小數表示,如0.25表示,75%訓練train,25%測試test。
train_test_split() 的返回值:
x_train:訓練部分特征值
x_test:? ? 測試部分特征值
y_train:訓練部分目標值
y_test:? ? 測試部分目標值
# 劃分測試集和訓練集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)
3.2 數據標準化
? ? ? ?由于不同數據的單位不同,數據間的跨度較大,對結果影響較大,因此需要進行數據縮放,例如歸一化和標準化??紤]到歸一化的缺點:如果異常值較多,最大值和最小值間的差值較大,會造成很大影響。我采用數據標準化的方法,采用方差標準差,使標準化后的數據均值為0,標準差為1,使數據滿足標準正態分布。
# 先標準化再預測
from sklearn.preprocessing import StandardScaler #導入標準化縮放方法
scaler = StandardScaler() #變量scaler接收標準化方法
# 傳入特征值進行標準化
# 對訓練的特征值標準化
x_train = scaler.fit_transform(x_train)
# 對測試的特征值標準化
x_test = scaler.fit_transform(x_test)
# 對驗證結果的特征值標準化
wine_predict_feature = scaler.fit_transform(wine_predict_feature)
?3.3 K近鄰預測分類
使用sklearn實現k近鄰算法
from sklearn.neighbors import KNeighborsClassifier?
KNeighborsClassifier(n_neighbors = 鄰居數,algorithm = '計算最近鄰居算法')
.fit(x_train,y_train)
KNeighborsClassifier()?括號內的參數:
n_neighbors:int類型,默認是5,可以自己更改。(找出離自身最近的k個點)
algorithm:用于計算最近鄰居的算法。有:'ball_tree'、'kd_tree'、'auto'。默認是'auto',根據傳遞給fit()方法的值來決定最合適的算法,自動選擇前兩個方法中的一個。
from sklearn.neighbors import KNeighborsClassifier #導入k近鄰算法庫
# k近鄰函數
knn = KNeighborsClassifier(n_neighbors=5,algorithm='auto')
# 把訓練的特征值和訓練的目標值傳進去
knn.fit(x_train,y_train)
? ? ? ? 將訓練所需的特征值和目標值傳入.fit()方法之后,即可開始預測。首先利用.score()評分法輸入用于測試的特征值和目標值,來看一下這個模型的準確率是多少,是否是滿足要求,再使用.predict()方法預測所需要的目標值。
評分法:根據x_test預測結果,把結果和真實的y_test比較,計算準確率
.score(x_test, y_test)
預測方法:
.predict(用于預測的特征值)
# 評分法計算準確率
accuracy = knn.score(x_test,y_test)
# 預測,輸入預測用的x值
result = knn.predict(wine_predict_feature)
? ? ? ?accuracy存放準確率,result存放預測結果,最終準確率為0.952,最終的分類結果和wine_predict_target存放的實際分類結果有微小偏差。
紅酒數據集免費獲取:
python實戰K近鄰算法,紅酒分類預測數據集.xls-Python文檔類資源-CSDN下載
完整代碼如下:
python機器學習K近鄰算法--紅酒分類預測.py-Python文檔類資源-CSDN下載
import pandas as pd
from sklearn import datasetswine = datasets.load_wine() # 獲取葡萄酒數據
wine_data = wine.data #獲取葡萄酒的索引data數據,178行13列
wine_target = wine.target #獲取分類目標值wine_data = pd.DataFrame(data = wine_data) #轉換成DataFrame類型數據
wine_target = pd.DataFrame(data = wine_target)
# 將target插入到第一列
wine_data.insert(0,'class',wine_target)# ==1== 變量.sample(frac=1) 表示洗牌,重新排序
# ==2== 變量.reset_index(drop=True) 使index從0開始排序,可以省略這一步
wine = wine_data.sample(frac=1).reset_index(drop=True)# 拿10行出來作驗證
wine_predict = wine[-10:].reset_index(drop=True)
wine_predict_feature = wine_predict.drop('class',axis=1) #用于驗證的特征值,輸入到predict()函數中
wine_predict_target = wine_predict['class'] #目標值,用于和最終預測結果比較wine = wine[:-10] #刪除后10行
features = wine.drop(columns=['class'],axis=1) #刪除class這一列,產生返回值,這個是特征值
targets = wine['class'] #class這一列就是目標值
# 相當于13個特征值對應1個目標# 劃分測試集和訓練集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)# 先標準化再預測
from sklearn.preprocessing import StandardScaler #導入標準化縮放方法
scaler = StandardScaler() #變量scaler接收標準化方法# 傳入特征值進行標準化
x_train = scaler.fit_transform(x_train) #對訓練的特征值標準化
x_test = scaler.fit_transform(x_test) #對測試的特征值標準化
wine_predict_feature = scaler.fit_transform(wine_predict_feature)# 使用K近鄰算法分類
from sklearn.neighbors import KNeighborsClassifier #導入k近鄰算法庫
# k近鄰函數
knn = KNeighborsClassifier(n_neighbors=5,algorithm='auto')# 訓練,把訓練的特征值和訓練的目標值傳進去
knn.fit(x_train,y_train)
# 檢測模型正確率--傳入測試的特征值和目標值
# 評分法,根據x_test預測結果,把結果和真實的y_test比較,計算準確率
accuracy = knn.score(x_test,y_test)
# 預測,輸入預測用的x值
result = knn.predict(wine_predict_feature)
總結
以上是生活随笔為你收集整理的【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Pandas库】(5) 索引操作--增
- 下一篇: 【机器学习入门】(2) 朴素贝叶斯算法: