概念

根據你的“鄰居”判斷你的類別

流程

KNN api 初步使用
機器學習流程

Scikit-learn工具

安裝
pip3 install scikit-learn==0.19.1
注:需要Numpy,Scipy等庫的支持
Python (>= 3.5),
NumPy (>= 1.11.0),
SciPy (>= 0.17.0),
joblib (>= 0.11).
檢驗安裝
import sklearn
Scikit-learn包含內容

K-近鄰演算法API

測驗
from sklearn.neighbors import KNeighborsClassifier
# 構造資料
x = [[1], [5], [10], [20]]
y = [2, 2, 6, 6]
# 訓練模型
# 實體化估計器物件
estimator = KNeighborsClassifier(n_neighbors=1)
# 呼叫fit方法 進行訓練
estimator.fit(x, y)
# 資料預測
ret = estimator.predict([[2]])
print(ret)
ret = estimator.predict([[30]])
print(ret)

K值的選擇



k近鄰搜索演算法

KD樹
why

what

how


樹的建立

- 多個維度,選擇最分散的一個維度排序、取中位數進行第一次劃分(這里選擇x軸)
- 根據第一次選擇的維度的中位數進行左右劃分(2、4、5 | 8、9),將對應的另一維度數值進行排序、取中位數劃分
- 重復上兩步,直到無法劃分


最近領域搜索

例:查(2.1,3.1)

例:查(2,4.5)

KD樹總結

scikit-learn 資料集

sklearn小資料集

sklearn大資料集

sklearn 資料集回傳值介紹

from sklearn.datasets import load_iris,fetch_20newsgroups
# 小資料集獲取
iris = load_iris()
# print(iris)
# 大資料集獲取
# news = fetch_20newsgroups()
# print(news)
# 資料集屬性描述
print("資料集特征值是:\n", iris.data)
print("資料集目標值是:\n", iris["target"])
print("資料集特征值名字是:\n", iris.feature_names)
print("資料集目標值名字是:\n", iris.target_names)
print("資料集描述是:\n", iris.DESCR)

資料可視化

from sklearn.datasets import load_iris, fetch_20newsgroups
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from pylab import mpl
# 設定顯示中文字體
mpl.rcParams['font.sans-serif'] = ["SimHei"]
# 設定正常顯示符號
mpl.rcParams['axes.unicode_minus'] = False
# 小資料集獲取
iris = load_iris()
# 資料可視化
iris_d = pd.DataFrame(data=iris.data, columns=["Sepal_Length", "Sepal_Width", "Petal_length", "Petal_Width"])
print(iris_d)
iris_d["target"] = iris.target
def iris_plot(data, col1, col2):
sns.lmplot(x=col1, y=col2, data=data,hue="target",fit_reg=False)
plt.xlabel(col1)
plt.ylabel(col2)
plt.title("種類分布圖")
plt.show()
iris_plot(iris_d, "Sepal_Width", "Petal_Length")


資料集劃分

from sklearn.datasets import load_iris, fetch_20newsgroups
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22, test_size=0.2)
print("訓練集的特征值是:\n", x_train)
print("訓練集的目標值是:\n", y_train)
print("測驗集的特征值是:\n", x_test)
print("測驗集的目標值是:\n", y_test)
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=2, test_size=0.2)
print("測驗集的目標值是:\n", y_test)
print("測驗集1的目標值是:\n", y_test1)

特征預處理

歸一化

公式


api

標準化

公式


api

預處理總結

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

# @Author : CG
# @File : 03-鳶尾花種類預測.py
# @Time : 2022/2/8 17:19
# @contact: gchencode@126.com
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 1.獲取資料集
iris = load_iris()
# 2.資料基本處理 不同的random_state將導致訓練集和測驗集的不同,進而導致最終準確率不同
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
# 3.特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#fit(): 用來計算mean(均值)和std(標準差),以便后面進行資料的標準化
#transform(): 根據fit()函式計算的mean和std對資料進行標準化
#fit_transform(): 是fit()函式和transform()函式的組合,先進行fit,之后再進行transform(標準化)
# fit_transform方法是fit和transform的結合,
# fit_transform(X_train) 意思是找出X_train的平均值和標準差,并應用在X_train上,
# 這時對于X_test,我們就可以直接使用transform方法,
# 因為此時StandardScaler已經保存了X_train的平均值和標準差,
#因為我們必須保證,測驗集在進行標準化的時候,使用的是統一的縮放引數,即為均值和標準差,所以先使用fit_transform()在訓練集上,再使用transform()在測驗集上,
# 4.機器學習(模型訓練)knn
# 實體化估計器
estimator = KNeighborsClassifier(n_neighbors=5)
# 模型訓練
estimator.fit(x_train, y_train)
# 5.模型評估
# 預測值結果輸出
y_pre = estimator.predict(x_test)
print("預測值是:\n", y_pre)
print("預測值與真實值的對別是:\n", y_pre == y_test)
# 準確率計算
score = estimator.score(x_test, y_test)
print(score)

KNN演算法總結
優點

缺點

交叉驗證,網格搜索
什么是交叉驗證



什么是網格搜索

交叉驗證,網格搜索(模型選擇與調優)API

# @Author : CG
# @File : 03-鳶尾花種類預測.py
# @Time : 2022/2/8 17:19
# @contact: gchencode@126.com
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 1.獲取資料集
iris = load_iris()
# 2.資料基本處理
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
# 3.特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#fit(): 用來計算mean(均值)和std(標準差),以便后面進行資料的標準化
#transform(): 根據fit()函式計算的mean和std對資料進行標準化
#fit_transform(): 是fit()函式和transform()函式的組合,先進行fit,之后再進行transform(標準化)
# fit_transform方法是fit和transform的結合,
# fit_transform(X_train) 意思是找出X_train的平均值和標準差,并應用在X_train上,
# 這時對于X_test,我們就可以直接使用transform方法,
# 因為此時StandardScaler已經保存了X_train的平均值和標準差,
#因為我們必須保證,測驗集在進行標準化的時候,使用的是統一的縮放引數,即為均值和標準差,所以先使用fit_transform()在訓練集上,再使用transform()在測驗集上,
# 4.機器學習(模型訓練)knn
# 實體化估計器
estimator = KNeighborsClassifier(n_neighbors=5)
# 模型調優 - 交叉驗證,網格搜索
param_grid = {"n_neighbors": [1, 3, 5, 7]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
# 模型訓練
estimator.fit(x_train, y_train)
# 5.模型評估
# 預測值結果輸出
y_pre = estimator.predict(x_test)
print("預測值是:\n", y_pre)
print("預測值與真實值的對別是:\n", y_pre == y_test)
# 準確率計算
score = estimator.score(x_test, y_test)
print(score)
# 交叉驗證、網格搜索結果
print("交叉驗證、網格搜索的最好結果是:\n", estimator.best_score_)
print("交叉驗證、網格搜索的最好模型是:\n", estimator.best_estimator_)
print("交叉驗證、網格搜索的模型結果是:\n", estimator.cv_results_)

常見距離公式
歐式距離

曼哈頓距離

切比雪夫距離

閔可夫斯基距離

常見距離小結

其他距離公式
標準化歐式距離

余弦距離

漢明距離


杰卡德距離

馬氏距離

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423609.html
標籤:AI
上一篇:各種距離概念與計算公式
