机器学习算法-sklearn源起

scikit-learn(简称 sklearn)是 Python 中最流行的开源机器学习库之一,基于 NumPy、SciPy 和 Matplotlib 构建。它提供了丰富的机器学习算法和工具,适用于数据挖掘和数据分析任务。以下是其核心特点的简介:

1、sklearn主要功能

  • 监督学习

    • 分类(如 SVM、随机森林、逻辑回归)等

    • 回归(如线性回归、岭回归)等

  • 无监督学习

    • 聚类(如 K-Means、DBSCAN)等

    • 降维(如 PCA、t-SNE)等

  • 模型选择与评估

    • 交叉验证、超参数调优(如网格搜索 GridSearchCV)等

    • 评估指标(如准确率、F1 分数、ROC 曲线)等

  • 数据预处理(数据集变换)

    • 标准化、归一化、缺失值处理、特征编码(如 One-Hot Encoding)等
  • 工具链集成

    • 流水线(Pipeline)支持多步骤任务(如预处理 + 建模)等

2、监督学习

监督学习(Supervised Learning)是机器学习的一种范式,其目标是从带有标签的数据 中学习一个模型,用于预测未知数据的标签。它主要分为 分类(Classification)回归(Regression) 两大类。以下是监督学习的核心算法及其应用场景:


2.1、分类(Classification)

预测离散类别标签(如垃圾邮件/正常邮件、图像类别等)。

2.1.1. 经典算法

  • 逻辑回归(Logistic Regression)

    • 用于二分类或多分类,输出概率值。

    • 适用场景:线性可分问题(如信用评分、疾病预测)。

    python 复制代码
    from sklearn.linear_model import LogisticRegression
    model = LogisticRegression()
  • 支持向量机(SVM, Support Vector Machine)

    • 通过最大化分类间隔找到最优决策边界,可处理高维数据。

    • 适用场景:小样本、高维数据(如文本分类、图像识别)。

    python 复制代码
    from sklearn.svm import SVC
    model = SVC(kernel='linear')  # 线性核或高斯核(RBF)
  • 决策树(Decision Tree)

    • 基于树结构的规则划分,可解释性强。

    • 适用场景:非线性关系数据(如客户分群、诊断决策)。

    python 复制代码
    from sklearn.tree import DecisionTreeClassifier
    model = DecisionTreeClassifier(max_depth=5)
  • 随机森林(Random Forest)

    • 多棵决策树的集成,降低过拟合风险。

    • 适用场景:复杂非线性问题(如金融风控、推荐系统)。

    python 复制代码
    from sklearn.ensemble import RandomForestClassifier
    model = RandomForestClassifier(n_estimators=100)
  • K近邻(K-Nearest Neighbors, KNN)

    • 基于样本距离的"投票"机制,简单但计算量大。

    • 适用场景:小规模数据、局部特征明显(如手写数字识别)。

    python 复制代码
    from sklearn.neighbors import KNeighborsClassifier
    model = KNeighborsClassifier(n_neighbors=5)
  • 朴素贝叶斯(Naive Bayes)

    • 基于贝叶斯定理,假设特征之间独立。

    • 适用场景:文本分类(如垃圾邮件过滤、情感分析)。

    python 复制代码
    from sklearn.naive_bayes import GaussianNB
    model = GaussianNB()

2.1.2. 进阶方法

  • 梯度提升树(如 XGBoost、LightGBM、CatBoost

  • 神经网络(如 MLPClassifier

  • 集成学习(如 VotingClassifier、Stacking


2.2、回归(Regression)

预测连续数值(如房价、温度、销售额等)。

2.2.1. 经典算法

  • 线性回归(Linear Regression)

    • 拟合线性关系,可解释性强。

    • 适用场景:自变量与因变量呈线性关系(如经济预测)。

    python 复制代码
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
  • 岭回归(Ridge Regression)

    • 在线性回归基础上加入 L2 正则化,防止过拟合。

    • 适用场景:多重共线性数据。

    python 复制代码
    from sklearn.linear_model import Ridge
    model = Ridge(alpha=1.0)
  • Lasso 回归(Lasso Regression)

    • 加入 L1 正则化,可进行特征选择。

    • 适用场景:高维稀疏数据(如基因数据分析)。

    python 复制代码
    from sklearn.linear_model import Lasso
    model = Lasso(alpha=0.1)
  • 支持向量回归(SVR, Support Vector Regression)

    • 基于 SVM 的回归版本,可处理非线性问题。

    • 适用场景:小样本、非线性回归(如股票价格预测)。

    python 复制代码
    from sklearn.svm import SVR
    model = SVR(kernel='rbf')
  • 决策树回归(Decision Tree Regressor)

    • 通过树结构划分数据区域,预测每个区域的均值。
    python 复制代码
    from sklearn.tree import DecisionTreeRegressor
    model = DecisionTreeRegressor()
    复制代码
     
  • 随机森林回归(Random Forest Regressor)

    • 多棵回归树的集成,提升预测稳定性。
    python 复制代码
    from sklearn.ensemble import RandomForestRegressor
    model = RandomForestRegressor()

2.3、适用场景

场景类型 问题示例 典型算法
分类 垃圾邮件检测、图像分类 SVM、随机森林、逻辑回归
回归 房价预测、销量预测 线性回归、梯度提升树、SVR

3、无监督学习

无监督学习(Unsupervised Learning)是机器学习的一种范式,其目标是从无标签数据中挖掘潜在的结构或模式,无需依赖人工标注。以下是其核心方法、应用场景及典型算法的详细介绍:

3.1、核心任务类型

无监督学习主要分为以下几类任务:

  1. 聚类(Clustering)

    将数据划分为有相似性的组(簇)。

  2. 降维(Dimensionality Reduction)

    减少数据维度,保留重要信息。

  3. 关联规则(Association Rule)

    发现数据中的频繁项集或关联关系。

  4. 异常检测(Anomaly Detection)

    识别数据中的异常点或离群值。


3.2、主要算法与实现

3.2.1. 聚类(Clustering)

  • K-Means

    • 通过迭代将数据划分到K个簇中,以最小化簇内平方误差。

    • 适用场景:客户分群、图像压缩(颜色量化)。

    • 代码示例(sklearn):

      python 复制代码
      from sklearn.cluster import KMeans
      model = KMeans(n_clusters=3)
      clusters = model.fit_predict(X)
  • DBSCAN

    • 基于密度划分簇,可发现任意形状的簇并识别噪声点。

    • 适用场景:地理空间数据聚类(如地震点分布)、异常检测。

    • 代码示例

      python 复制代码
      from sklearn.cluster import DBSCAN
      model = DBSCAN(eps=0.5, min_samples=5)
      clusters = model.fit_predict(X)
  • 层次聚类(Hierarchical Clustering)

    • 构建树状结构(树状图)划分簇,适合多粒度分析。

    • 适用场景:生物基因分类、文档主题分层。

  • 高斯混合模型(GMM)

    • 假设数据服从多个高斯分布的混合,用概率模型划分簇。

    • 适用场景:语音信号分离、图像分割。


3.2.2. 降维(Dimensionality Reduction)

  • 主成分分析(PCA)

    • 通过正交变换将数据投影到低维空间,保留最大方差。

    • 适用场景:可视化高维数据(如基因表达数据降维到2D)、去噪。

    • 代码示例

      python 复制代码
      from sklearn.decomposition import PCA
      pca = PCA(n_components=2)
      X_reduced = pca.fit_transform(X)
  • t-SNE

    • 非线性降维,适合保留局部结构,常用于可视化。

    • 适用场景:高维数据探索(如MNIST手写数字可视化)。

  • UMAP

    • 类似t-SNE但计算效率更高,同时保留全局和局部结构。

    • 适用场景:单细胞RNA测序数据分析。


3.2.3. 关联规则(Association Rule)

  • Apriori算法

    • 发现频繁项集(如购物篮分析中的商品组合)。

    • 适用场景:零售商品推荐(如"啤酒与尿布"关联)。

    • 代码示例(mlxtend库):

      python 复制代码
      from mlxtend.frequent_patterns import apriori
      frequent_itemsets = apriori(df, min_support=0.1, use_colnames=True)
  • FP-Growth算法

    • 比Apriori更高效,通过树结构压缩数据。

    • 适用场景:大规模交易数据分析。


3.2.4. 异常检测(Anomaly Detection)

  • 孤立森林(Isolation Forest)

    • 通过随机划分树快速隔离异常点(异常点路径更短)。

    • 适用场景:金融欺诈检测、工业设备故障预警。

    • 代码示例

      python 复制代码
      from sklearn.ensemble import IsolationForest
      model = IsolationForest(contamination=0.01)
      anomalies = model.fit_predict(X)
  • LOF(局部离群因子)

    • 基于密度的异常检测,适合局部稀疏区域识别。

    • 适用场景:网络入侵检测、传感器异常值识别。

3.3、适用场景

场景类型 问题示例 典型算法
聚类 客户分群、社交网络社区发现 K-Means、DBSCAN、层次聚类
降维 图像压缩、特征工程预处理 PCA、t-SNE、UMAP
关联规则 购物篮分析、广告投放策略优化 Apriori、FP-Growth
异常检测 信用卡欺诈检测、设备故障预警 孤立森林、LOF

4、模型评估

模型评估是机器学习流程中的关键环节,其目的是衡量模型的性能和泛化能力。以下是针对不同任务类型(分类、回归、聚类等)的评估方法及核心指标详解:

4.1、分类任务评估

4.1.1. 基础指标

  • 准确率(Accuracy)

    • 公式:正确预测样本数 / 总样本数

    • 代码:sklearn.metrics.accuracy_score(y_true, y_pred)

    • 适用场景:类别均衡时有效,但类别不平衡时易误导(如99%负样本时,全预测负类准确率99%)。

  • 混淆矩阵(Confusion Matrix)

    • 可视化模型预测结果的四象限矩阵(TP、TN、FP、FN)。

    • 代码:sklearn.metrics.confusion_matrix

  • 精确率(Precision)

    • 公式:TP / (TP + FP)

    • 意义:预测为正的样本中实际为正的比例(减少误报)。

    • 适用场景:注重减少FP(如垃圾邮件分类中避免误判正常邮件)。

  • 召回率(Recall)

    • 公式:TP / (TP + FN)

    • 意义:实际为正的样本中被正确预测的比例(减少漏报)。

    • 适用场景:注重减少FN(如疾病诊断中避免漏诊)。

  • F1分数(F1 Score)

    • 公式:2 * (Precision * Recall) / (Precision + Recall)

    • 意义:精确率和召回率的调和平均,平衡二者。

    • 代码:sklearn.metrics.f1_score


4.2、回归任务评估

4.21. 核心指标

  • 均方误差(MSE, Mean Squared Error)

    • 公式:Σ(y_pred - y_true)^2 / n

    • 代码:sklearn.metrics.mean_squared_error

    • 特点:对异常值敏感(平方放大误差)。

  • 均方根误差(RMSE)

    • 公式:√MSE

    • 意义:与目标变量单位一致,更易解释。

  • 平均绝对误差(MAE)

    • 公式:Σ|y_pred - y_true| / n

    • 代码:sklearn.metrics.mean_absolute_error

    • 特点:对异常值鲁棒性强。

  • R²分数(决定系数)

    • 公式:1 - (残差平方和) / (总平方和)

    • 范围:(-∞, 1],越接近1模型越好。

    • 代码:sklearn.metrics.r2_score


4.3、聚类任务评估

4.3.1. 有标签评估

  • 调整兰德指数(Adjusted Rand Index, ARI)

    • 衡量聚类结果与真实标签的相似性,值越接近1越好。

    • 代码:sklearn.metrics.adjusted_rand_score

  • 归一化互信息(NMI, Normalized Mutual Information)

    • 基于信息论衡量聚类与真实标签的关联性。

    • 代码:sklearn.metrics.normalized_mutual_info_score

4.3.2. 无标签评估

  • 轮廓系数(Silhouette Coefficient)

    • 公式:(b - a) / max(a, b)

      • a:样本与同簇其他样本的平均距离

      • b:样本与最近其他簇样本的平均距离

    • 范围:[-1, 1],值越大聚类效果越好。

    • 代码:sklearn.metrics.silhouette_score

5、数据集变换

数据集变换是机器学习流程中的核心步骤,旨在将原始数据转化为适合模型训练的格式,提升模型性能和稳定性。以下是数据集变换的核心方法、工具及实践指南:

5.1、数据清洗(可参考数据预处理文章)

5.1.1. 处理缺失值

  • 删除缺失样本/特征

    • 适用场景:缺失比例高(如>80%)且对目标无显著影响。

    • 代码:

      python 复制代码
      df.dropna(axis=0, how='any')  # 删除含缺失值的行
      df.drop(columns=['feature_name'], inplace=True)  # 删除某列
  • 填充缺失值

    • 均值/中位数填充:适合数值型特征(如年龄、收入)。

      python 复制代码
      from sklearn.impute import SimpleImputer
      imputer = SimpleImputer(strategy='median')
      X_filled = imputer.fit_transform(X)
    • 众数填充:适合分类特征(如性别、职业类别)。

    • 插值法:时间序列数据(如线性插值、样条插值)。

  • 模型预测填充

    • 用其他特征预测缺失值(如用KNN回归)。
    python 复制代码
    from sklearn.impute import KNNImputer
    imputer = KNNImputer(n_neighbors=3)
    X_filled = imputer.fit_transform(X)

5.1.2. 处理异常值

  • 统计方法

    • Z-Score法:将绝对值大于3的值视为异常。

      python 复制代码
      from scipy.stats import zscore
      z_scores = zscore(X['feature'])
      outliers = (np.abs(z_scores) > 3)
    • IQR法:定义异常值为低于Q1-1.5IQR或高于Q3+1.5IQR。

  • 模型方法

    • 使用孤立森林(Isolation Forest)或LOF算法检测异常点。

5.2、特征编码

5.2.1. 分类特征编码

  • 标签编码(Label Encoding)

    • 将类别转换为整数(如"红/绿/蓝" → 0/1/2)。

    • 适用场景:有序分类变量(如学历等级)。

    python 复制代码
    from sklearn.preprocessing import LabelEncoder
    encoder = LabelEncoder()
    X['color'] = encoder.fit_transform(X['color'])
  • 独热编码(One-Hot Encoding)

    • 将类别转换为二进制向量(如"红" → [1,0,0])。

    • 适用场景:无序分类变量(如城市名称)。

    python 复制代码
    from sklearn.preprocessing import OneHotEncoder
    encoder = OneHotEncoder(sparse=False)
    encoded_features = encoder.fit_transform(X[['color']])
  • 目标编码(Target Encoding)

    • 用目标变量的均值对类别编码(需防止过拟合)。
    python 复制代码
    from category_encoders import TargetEncoder
    encoder = TargetEncoder()
    X['city_encoded'] = encoder.fit_transform(X['city'], y)

5.2.2. 文本特征编码

  • 词袋模型(Bag of Words)

    • 统计词频生成稀疏矩阵。
    python 复制代码
    from sklearn.feature_extraction.text import CountVectorizer
    vectorizer = CountVectorizer()
    X_text = vectorizer.fit_transform(text_data)
  • TF-IDF

    • 衡量词的重要性(词频-逆文档频率)。
    python 复制代码
    from sklearn.feature_extraction.text import TfidfVectorizer
    vectorizer = TfidfVectorizer()
    X_tfidf = vectorizer.fit_transform(text_data)

5.3、特征缩放

5.3.1. 标准化(Standardization)

  • 将数据转换为均值为0、标准差为1的分布。

  • 适用场景:大多数算法(如SVM、神经网络)。

python 复制代码
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

5.3.2. 归一化(Normalization)

  • 将数据缩放到[0,1]或[-1,1]区间。

  • 适用场景:图像像素值、无显著异常值的数据。

python 复制代码
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
X_normalized = scaler.fit_transform(X)

5.3.3. 鲁棒缩放(Robust Scaling)

  • 使用中位数和四分位数缩放,降低异常值影响。
python 复制代码
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
X_robust = scaler.fit_transform(X)

5.4、特征构造

5.4.1. 数值特征衍生

  • 多项式特征:生成特征间的交互项。

    python 复制代码
    from sklearn.preprocessing import PolynomialFeatures
    poly = PolynomialFeatures(degree=2, include_bias=False)
    X_poly = poly.fit_transform(X)
  • 分箱(Binning):将连续变量离散化(如年龄分段为青年/中年/老年)。

    python 复制代码
    import pandas as pd
    df['age_bin'] = pd.cut(df['age'], bins=[0, 18, 35, 60, 100], labels=['child', 'young', 'adult', 'senior'])

5.4.2. 时间特征处理

  • 提取年、月、日、星期几等时间成分。

  • 计算时间差(如用户注册至今的天数)。

5.4.3. 文本特征提取

  • 提取词性(POS)、命名实体(NER)等高级语义特征。

5.5、降维与特征选择

5.5.1. 主成分分析(PCA)

  • 通过线性变换保留最大方差的方向。
python 复制代码
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95)  # 保留95%方差
X_pca = pca.fit_transform(X_scaled)

5.5.2. 特征重要性筛选

  • 基于树模型(如随机森林)评估特征重要性。
python 复制代码
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X, y)
importance = model.feature_importances_

5.5.3. 递归特征消除(RFE)

  • 递归删除不重要的特征。
python 复制代码
from sklearn.feature_selection import RFE
selector = RFE(estimator=LogisticRegression(), n_features_to_select=10)
X_selected = selector.fit_transform(X, y)

5.6、处理不平衡数据

5.6.1. 过采样(Oversampling)

  • SMOTE:生成少数类合成样本。

    python 复制代码
    from imblearn.over_sampling import SMOTE
    smote = SMOTE()
    X_resampled, y_resampled = smote.fit_resample(X, y)

5.6.2. 欠采样(Undersampling)

  • 随机删除多数类样本。

    python 复制代码
    from imblearn.under_sampling import RandomUnderSampler
    undersample = RandomUnderSampler()
    X_resampled, y_resampled = undersample.fit_resample(X, y)

5.6.3. 调整类别权重

  • 在模型训练中赋予少数类更高权重。
python 复制代码
model = RandomForestClassifier(class_weight='balanced')
相关推荐
Allo2025 分钟前
人脸识别流程与算法对比报告
算法
MaCa .BaKa13 分钟前
40-智慧医疗服务平台(在线接/问诊/机器学习)
java·spring boot·mysql·机器学习·maven·numpy·pandas
虾球xz1 小时前
游戏引擎学习第308天:调试循环检测
前端·c++·学习·算法·游戏引擎
摆烂仙君1 小时前
华为2025年校招笔试手撕真题教程(三)
数据结构·算法·华为
曦月逸霜2 小时前
第十七次CCF-CSP算法(含C++源码)
开发语言·数据结构·c++·算法
起床学FPGA2 小时前
tvalid寄存器的理解
人工智能·机器学习
kovlistudio2 小时前
机器学习第二十四讲:scikit-learn → 机器学习界的瑞士军刀
人工智能·机器学习·scikit-learn
患得患失9492 小时前
【算法】力扣体系分类
算法·leetcode·分类
油泼辣子多加3 小时前
【风控】行为评分卡(B卡)模型
算法·金融·集成学习