Scikit-learn

Machine Learning Python Scikit-learn Data Science

Scikit-learn,常写作 scikit-learn 或简写为 sklearn,是 Python 编程语言中功能强大的开源机器学习库。它旨在为预测性数据分析提供简单高效的工具,已成为全球数据科学家和机器学习实践者不可或缺的资源。

概述

Scikit-learn 构建在多个流行的 Python 库之上,主要包括 NumPySciPymatplotlib。它通过一致的 Python 接口提供多种有监督和无监督机器学习算法。该库以易用性、高性能和简洁的 API 著称,适合初学者和有经验的用户使用。

起源与发展

该项目最初由 David Cournapeau 于 2007 年以 scikits.learn(Google 编程之夏项目)形式启动。“scikits”(SciPy Toolkits)命名空间用于开发和分发 SciPy 的扩展。2010 年,Fabian PedregosaGaël VaroquauxAlexandre GramfortVincent Michel 在法国计算机与自动化研究院(INRIA)Saclay 分部对该项目进行了进一步开发。

自 2010 年首次公开发布以来,Scikit-learn 在活跃的开发者和研究者社区推动下得到了重大发展。它已演变为 Python 最流行的机器学习库之一,在学术界和工业界被广泛应用。

主要特性

1. 丰富的机器学习算法

Scikit-learn 实现了多种机器学习算法,包括:

  • 分类:判断对象属于哪个类别。常用算法有支持向量机(SVM)、k 近邻(k-NN)、随机森林、梯度提升等。
  • 回归:预测与对象相关的连续数值属性。常用算法有线性回归、岭回归、Lasso、弹性网等。
  • 聚类:自动将相似对象分组。常用算法有 k 均值、DBSCAN、层次聚类等。
  • 降维:减少数据特征数量,用于可视化、压缩或降噪。常用技术有主成分分析(PCA)、t-SNE 等。

2. 一致的 API 与高效实现

Scikit-learn 设计了一套在所有模块中一致的 API。只要掌握了基本接口,就可以轻松切换不同模型。核心接口包括:

  • fit():用于训练模型。
  • predict():用训练好的模型进行预测。
  • transform():对数据进行修改或降维(用于预处理和降维)。

该库针对性能进行了优化,核心算法采用 Cython(Python 的超集,能提供接近 C 语言的性能)实现,即使处理大规模数据集也能高效计算。

3. 与 Python 生态系统集成

Scikit-learn 能与其他 Python 库无缝集成:

  • 使用 NumPySciPy 进行高效数值计算。
  • 利用 Pandas 通过 DataFrame 进行数据操作。
  • 借助 Matplotlibseaborn 进行数据可视化。
  • 通过 Joblib 实现并行高效计算。

这种集成方式使得数据处理流程灵活且强大。

4. 易用性与开源

作为基于 BSD 许可协议的开源库,Scikit-learn 可免费用于个人和商业用途。其详尽的文档和活跃的社区支持,让各类用户都能轻松上手。

安装

如果已安装 NumPy 和 SciPy,安装 Scikit-learn 非常简单。可以使用 pip 安装:

pip install -U scikit-learn

或使用 Anaconda 发行版时通过 conda 安装:

conda install scikit-learn

Scikit-learn 的使用方法

Scikit-learn 常用于构建预测模型和执行各类机器学习任务。基本流程如下:

1. 数据准备

在应用机器学习算法之前,需要对数据进行预处理:

  • 加载数据:可以从 CSV 文件、数据库或 Scikit-learn 内置数据集加载数据。
  • 处理缺失值:用插补方法填补缺失数据。
  • 编码分类变量:通过独热编码或标签编码将类别变量转为数值型。
  • 特征缩放:用如 StandardScalerMinMaxScaler 等缩放器进行归一化或标准化。

2. 划分数据集

将数据集划分为训练集和测试集,以评估模型在未见数据上的表现:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

3. 选择并训练模型

根据问题类型(分类、回归、聚类)选择合适的算法并训练模型:

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier()
model.fit(X_train, y_train)

4. 进行预测

用训练好的模型对新数据进行预测:

y_pred = model.predict(X_test)

5. 模型评估

使用合适的指标评估模型表现:

  • 分类指标:准确率、精确率、召回率、F1 分数、ROC AUC 分数。
  • 回归指标:平均绝对误差(MAE)、均方误差(MSE)、均方根误差(RMSE)、R² 分数。
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

6. 超参数调优

通过网格搜索或随机搜索等方法优化模型性能:

from sklearn.model_selection import GridSearchCV

param_grid = {'n_estimators': [100, 200], 'max_depth': [3, 5, None]}
grid_search = GridSearchCV(RandomForestClassifier(), param_grid)
grid_search.fit(X_train, y_train)

7. 交叉验证

用多份子集测试模型表现,验证其泛化能力:

from sklearn.model_selection import cross_val_score

scores = cross_val_score(model, X, y, cv=5)
print(f"Cross-validation scores: {scores}")

示例与应用场景

示例 1:鸢尾花分类

Scikit-learn 内置的经典数据集之一是鸢尾花数据集,任务是根据花萼长度、花萼宽度、花瓣长度和花瓣宽度四个特征将鸢尾花分为三类。

步骤:

  1. 加载数据集
    from sklearn.datasets import load_iris
    iris = load_iris()
    X, y = iris.data, iris.target
  2. 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
  3. 训练分类器(如支持向量机):
    from sklearn.svm import SVC
    model = SVC()
    model.fit(X_train, y_train)
  4. 预测与评估
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    print(f"Accuracy: {accuracy}")

示例 2:房价预测

利用加州房价数据集(注意:波士顿房价数据集因伦理原因已弃用,建议使用加州房价等替代),可根据房间数、犯罪率等特征进行回归预测。

步骤:

  1. 加载数据集
    from sklearn.datasets import fetch_california_housing
    housing = fetch_california_housing()
    X, y = housing.data, housing.target
  2. 划分和预处理数据
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
  3. 训练回归器(如线性回归):
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
    model.fit(X_train, y_train)
  4. 预测与评估
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    print(f"MSE: {mse}")

示例 3:客户聚类

聚类可用于客户细分,将客户按购买行为分组。

步骤:

  1. 准备数据:收集并预处理客户交易数据。
  2. 数据缩放
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
  3. 应用 k 均值聚类
    from sklearn.cluster import KMeans
    kmeans = KMeans(n_clusters=3)
    kmeans.fit(X_scaled)
    clusters = kmeans.labels_
  4. 分析聚类结果:了解每个群体特征,便于精准营销。

Scikit-learn 在 AI 与聊天机器人中的应用

虽然 Scikit-learn 并非专为自然语言处理(NLP)或聊天机器人设计,但它在构建可集成于 AI 系统(包括聊天机器人)的机器学习模型中十分有用。

文本特征提取

Scikit-learn 提供将文本数据转为数值特征的工具:

  • CountVectorizer:将文本转为词频矩阵。
  • TfidfVectorizer:将文本转为 TF-IDF 特征矩阵。
from sklearn.feature_extraction.text import TfidfVectorizer

documents = ["Hello, how can I help you?", "What is your name?", "Goodbye!"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents)

聊天机器人中的意图分类

聊天机器人通常需要将用户问题归类为不同意图,以给出合适响应。可用 Scikit-learn 训练意图识别分类器。

步骤:

  1. 收集与标注数据:收集用户问句并标注意图。
  2. 文本向量化
    vectorizer = TfidfVectorizer()
    X = vectorizer.fit_transform(queries)
  3. 训练分类器
    model = LogisticRegression()
    model.fit(X, intents)
  4. 预测意图
    new_query = "Can you help me with my account?"
    X_new = vectorizer.transform([new_query])
    predicted_intent = model.predict(X_new)

情感分析

理解用户消息的情感有助于提升聊天机器人体验。

from sklearn.datasets import fetch_openml

# 假设已有标注好的情感分析数据集
X_train, X_test, y_train, y_test = train_test_split(X, y)

model = SVC()
model.fit(X_train, y_train)

与 AI 自动化工具的集成

Scikit-learn 模型可集成到更大的 AI 系统和自动化流程中:

  • 流程集成:Scikit-learn 的 Pipeline 类可将预处理和建模步骤串联起来,便于自动化

    from sklearn.pipeline import Pipeline
    pipeline = Pipeline([
        ('vectorizer', TfidfVectorizer()),
        ('classifier', LogisticRegression())
    ])
    pipeline.fit(queries, intents)
    
  • 模型部署:可用 joblib 保存训练好的模型并集成到生产系统。

    import joblib
    joblib.dump(model, 'model.joblib')
    # 之后
    model = joblib.load('model.joblib')
    

优势与局限

优势

  • 易用性:API 简单且一致。
  • 完善文档:指南和教程详尽。
  • 社区支持:活跃的开发和支持社区。
  • 高性能:高效实现,适用于大规模数据集。

局限

  • 深度学习:Scikit-learn 不支持深度学习,建议使用 TensorFlow 或 PyTorch。
  • 在线学习:仅有限支持在线或增量学习算法。
  • GPU 加速:不原生支持 GPU 加速计算。

替代方案

虽然 Scikit-learn 很全面,但针对特定需求也有其它选择:

  • TensorFlowKeras:用于深度学习和神经网络。
  • PyTorch:适合高级机器学习研究和深度学习。
  • XGBoostLightGBM:在大规模数据集上性能优异的梯度提升算法。
  • spaCy:用于高级自然语言处理。

Scikit-learn 相关研究

Scikit-learn 是一个集成了多种先进机器学习算法、适用于中小规模有监督与无监督问题的综合性 Python 模块。Fabian Pedregosa 等人于 2018 年发表的论文“Scikit-learn: Machine Learning in Python”对此工具进行了深入介绍。作者强调,Scikit-learn 旨在通过通用的高级语言,让非专业人士也能便捷地使用机器学习。该包专注于易用性、性能和 API 一致性,并保持极少的依赖,从而在学术和商业环境中都非常适用(基于简化的 BSD 许可协议)。更多详细信息、源码、二进制文件与文档可访问 Scikit-learn。原始论文见这里

常见问题

什么是 Scikit-learn?

Scikit-learn 是一个为 Python 设计的开源机器学习库,旨在为数据分析和建模提供简单、高效的工具。它支持广泛的有监督和无监督学习算法,包括分类、回归、聚类和降维等。

Scikit-learn 的主要特性有哪些?

Scikit-learn 提供一致性的 API、众多机器学习算法的高效实现、与 NumPy 和 pandas 等主流 Python 库的集成、详尽的文档以及强大的社区支持。

如何安装 Scikit-learn?

您可以使用 pip 命令 'pip install -U scikit-learn' 安装 Scikit-learn,或在使用 Anaconda 发行版时通过 'conda install scikit-learn' 进行安装。

Scikit-learn 可以用于深度学习吗?

Scikit-learn 并非为深度学习而设计。针对高级神经网络和深度学习任务,更适合使用 TensorFlow 或 PyTorch 等库。

Scikit-learn 适合初学者吗?

是的,Scikit-learn 以易用性、简洁的 API 以及优秀的文档著称,非常适合机器学习领域的初学者和有经验的用户。

开始使用 Scikit-learn 构建项目

了解 Scikit-learn 如何简化您的机器学习项目。利用 Python 领先的 ML 库高效地构建、训练和部署模型。

了解更多

SciPy

SciPy

SciPy 是一个强大的开源 Python 库,用于科学和技术计算。在 NumPy 的基础上,它提供了高级的数学算法、优化、积分、数据处理、可视化,并与 Matplotlib 和 Pandas 等库高度兼容,使其成为科学计算和数据分析不可或缺的工具。...

1 分钟阅读
SciPy Python +5
学习曲线

学习曲线

人工智能中的学习曲线是一种图形化表示,用于展示模型的学习性能与数据集大小或训练迭代次数等变量之间的关系,有助于诊断偏差-方差权衡、模型选择以及优化训练过程。...

1 分钟阅读
AI Machine Learning +3
SpaCy

SpaCy

spaCy 是一个强大的开源 Python 库,专为高级自然语言处理(NLP)而设计,以其速度、效率和面向生产的特性(如分词、词性标注和命名实体识别)而闻名。...

2 分钟阅读
spaCy NLP +4