机器学习算法-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')
相关推荐
沐怡旸17 小时前
【算法】【链表】328.奇偶链表--通俗讲解
算法·面试
小白狮ww17 小时前
LAMMPS 教程:移动原子演示
人工智能·深度学习·机器学习
掘金安东尼20 小时前
Amazon Lambda + API Gateway 实战,无服务器架构入门
算法·架构
码流之上21 小时前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
快手技术1 天前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
CoovallyAIHub2 天前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP2 天前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo2 天前
半开区间和开区间的两个二分模版
算法
moonlifesudo2 天前
300:最长递增子序列
算法
CoovallyAIHub2 天前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉