唤醒手腕2025年最新机器学习K近邻算法详细教程
KNN(K-Nearest Neighbors) 是一种 基于实例(Instance-based) 的监督学习算法,常用于 分类 和 回归。
欧式距离 Euclidean Distance
欧氏距离(Euclidean Distance)。欧氏距离 是最常用的距离度量方法,用来衡量两个点在欧几里得空间(Euclidean Space)中的“直线距离”。简单来说,它就是我们平时理解的“直线距离”或“最短距离”。
距离类型 | 定义特点 | 适用场景 |
---|---|---|
欧氏距离 | 平方和再开根号 | 连续数值、低维空间 |
曼哈顿距离 | 绝对值差的和 | 离散格点、路径型问题 |
闵可夫斯基距离 | 泛化形式 (p 参数) | 可调节灵活性 |
余弦距离 | 基于角度相似度 | 文本、向量方向重要的场景 |
scikit-learn
scikit-learn 是 Python 生态中最主流、最成熟的 机器学习(Machine Learning)库 之一。它提供了从 数据预处理 → 模型训练 → 评估 → 调参 → 部署 的完整流程支持。
https://scikit-learn.org/
核心功能模块
模块 | 作用 | 示例类 |
---|---|---|
数据预处理 (sklearn.preprocessing ) | 标准化、归一化、编码、缺失值处理 | StandardScaler , OneHotEncoder , LabelEncoder , SimpleImputer |
特征工程 (sklearn.feature_selection ) | 特征选择、降维 | SelectKBest , PCA |
模型构建 (sklearn.linear_model , neighbors , tree , svm , ensemble , etc.) | 各类监督/无监督学习算法 | LogisticRegression , KNeighborsClassifier , RandomForest , SVC , KMeans |
模型评估 (sklearn.metrics , model_selection ) | 精度评估、交叉验证、划分数据集 | train_test_split , cross_val_score , accuracy_score , confusion_matrix |
模型调优 (sklearn.model_selection ) | 网格搜索、随机搜索 | GridSearchCV , RandomizedSearchCV |
Pipeline 管线化 (sklearn.pipeline ) | 将预处理与模型组合成统一流程 | Pipeline , ColumnTransformer |
scikit-learn 工作流程(核心思想)
阶段 | 方法 | 说明 |
---|---|---|
训练阶段 | fit(X, y) | 训练模型或学习参数 |
预测阶段 | predict(X) | 输出预测结果 |
评分阶段 | score(X, y) | 返回模型性能指标(如分类精度) |
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 1. 划分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 2. 标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 3. 建立模型
knn = KNeighborsClassifier(n_neighbors=5)# 4. 训练
knn.fit(X_train, y_train)# 5. 预测
y_pred = knn.predict(X_test)# 6. 评估
print("Accuracy:", accuracy_score(y_test, y_pred))
算法类别 | sklearn 模块 | 示例模型 |
---|---|---|
线性模型 | sklearn.linear_model | LinearRegression , LogisticRegression , Ridge , Lasso |
树模型 | sklearn.tree | DecisionTreeClassifier , DecisionTreeRegressor |
集成模型 | sklearn.ensemble | RandomForest , GradientBoosting , AdaBoost |
支持向量机 | sklearn.svm | SVC , SVR |
邻近算法 | sklearn.neighbors | KNeighborsClassifier , KNeighborsRegressor |
朴素贝叶斯 | sklearn.naive_bayes | GaussianNB , MultinomialNB |
聚类 | sklearn.cluster | KMeans , DBSCAN |
降维 | sklearn.decomposition | PCA , NMF |
数据预处理模块常用工具
功能 | 类 | 说明 |
---|---|---|
缺失值处理 | SimpleImputer | 填充缺失值(均值、中位数等) |
标准化 | StandardScaler | 均值为 0,方差为 1 |
归一化 | MinMaxScaler | 映射到 [0,1] 区间 |
类别编码 | OneHotEncoder , LabelEncoder | 将分类变量转为数字 |
特征选择 | SelectKBest , VarianceThreshold | 保留重要特征 |
模型评估
from sklearn.metrics import confusion_matrix, classification_reportprint(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
网格搜索(GridSearchCV)
from sklearn.model_selection import GridSearchCVparam_grid = {'n_neighbors': [3, 5, 7, 9]}
grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid.fit(X_train, y_train)
print(grid.best_params_, grid.best_score_)
Pipeline 管线化
将预处理与模型打包为一个整体,避免“数据泄漏”,简化流程。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifierpipe = Pipeline([('scaler', StandardScaler()),('knn', KNeighborsClassifier(n_neighbors=5))
])pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)
kaggle 概述
Kaggle 是全球最大的数据科学和机器学习社区和竞赛平台,由 Google 在 2017 年收购。它被广泛认为是数据科学领域的“黄金标准”实践平台,无论是对于初学者还是资深专家。
核心定位:提供一个环境,让数据科学家、机器学习工程师、统计学家和数据分析师可以协作、竞争、学习,并解决真实世界的数据问题。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
import joblibheart_disease_data = pd.read_csv('./heart.csv')heart_disease_data.dropna(inplace=True)# heart_disease_data.info()# print(heart_disease_data.head())# 数据集划分X = heart_disease_data.drop(columns='target', axis=1)
Y = heart_disease_data.targetX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=42)# print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)numerical_features = ["age", # 年龄,连续数值"trestbps", # 静息血压"chol", # 胆固醇"thalach", # 最大心率"oldpeak", # 运动引起的ST下降"ca" # 主要血管数量(0-4)]categorical_features = ["cp", # 胸痛类型(4种分类:0-3)"restecg", # 静息心电图结果(0-2)"slope", # ST段斜率(0-2)"thal" # 地中海贫血(1=正常,2=固定缺陷,3=可逆缺陷)
]binary_features = ["sex", # 性别(1=男,0=女)"fbs", # 空腹血糖 > 120 mg/dl(1=是,0=否)"exang" # 运动诱发心绞痛(1=是,0=否)
]columnTransformer = ColumnTransformer(transformers=[("num", StandardScaler(), numerical_features),("cat", OneHotEncoder(drop="first"), categorical_features),("bin", "passthrough", binary_features)]
)X_train = columnTransformer.fit_transform(X_train)
X_test = columnTransformer.transform(X_test)print(X_train.shape)
print(X_test.shape)knn = KNeighborsClassifier(n_neighbors=3)knn.fit(X_train, y_train)print(knn.score(X_test, y_test))joblib.dump(knn, 'knn_model.joblib')