介绍

scikit-learn(简称sklearn)是一个基于Python的开源机器学习库,其设计目标是让机器学习变得更简单、更高效。自2007年由法国INRIA研究所的David Cournapeau首次提出并开发以来,scikit-learn经历了多次版本更新,逐步成为数据科学和人工智能领域最受欢迎的工具之一。

发展背景

随着大数据技术的兴起和数据驱动决策的重要性提升,机器学习基础算法的需求也不断增长。早期,机器学习研究多集中在学术论文和专业软件中,工程实现复杂且不易上手。scikit-learn的出现,极大地降低了算法的实现门槛,为研究者、工程师和学生提供了一个统一、易用、功能丰富的平台,使得机器学习应用变得更加普及和便利。

设计理念

scikit-learn强调“简洁一致”的API风格,遵循面向对象的设计思想,使用户可以用一种通用的方式处理不同模型。其核心原则包括:

易用性:API简洁直观,少量代码即可实现复杂任务。

一致性:无论是分类、回归还是聚类算法,接口设计保持统一。

扩展性强:支持自定义模型和预处理流程,便于扩展。

效率高:底层采用优化算法和Cython加速,确保在实际环境中的性能。

支持的算法和功能

scikit-learn涵盖了大量经典和现代的机器学习算法,常用的有:

分类算法:支持向量机(SVM)、逻辑回归、决策树、随机森林、K近邻(KNN)等。

回归算法:线性回归、岭回归、Lasso回归、支持向量回归等。

聚类算法:K-means、层次聚类、DBSCAN等。

降维算法:主成分分析(PCA)、t-SNE、线性判别分析(LDA)等。

模型选择与评估:交叉验证、网格搜索、各种性能指标(准确率、均方误差、F1分数等)。

应用领域

scikit-learn在多个领域得到广泛应用,包括但不限于:

科研:进行统计分析、模式识别、信号处理等。

工业:金融风控、推荐系统、客户细分、图像识别基础任务。

教育:教学案例、科研工具和快速原型开发。

创业项目:快速验证模型、实现算法原型。

主要特性

scikit-learn具有众多卓越的特点,使其成为机器学习工作中的首选库。

丰富的算法支持

scikit-learn提供了广泛的机器学习算法,几乎涵盖了各种常用模型,包括但不限于:

线性模型:线性回归(LinearRegression)、逻辑回归(LogisticRegression)、岭回归(Ridge)、Lasso等,用于回归和分类任务,具备良好的解释性和效率。

支持向量机(SVM):支持分类和回归的支持向量机(如SVC、SVR),在复杂边界问题和高维空间表现出色。

决策树与随机森林:决策树(DecisionTreeClassifier/Regressor)和随机森林(RandomForestClassifier/Regressor)实现强大的集成学习方法,提升模型的稳定性和准确性。

K近邻(KNN):一种简单直观的实例基础的算法,适合小规模数据集的分类和回归。

聚类算法:如K-means(KMeans)、层次聚类(AgglomerativeClustering)、DBSCAN等,用于数据无标签的分组。

此外,scikit-learn还支持一些特殊的任务,如概率估计、特征选择和复杂的管道(pipelines),满足多样化的需求。

易用的接口

整个库坚持“统一、简洁”的API设计风格:

模型的定义、训练、预测全部围绕几个核心方法:fit()、predict()和score()。

例如,训练模型只需:

model.fit(X_train, y_train)

预测则为:

y_pred = model.predict(X_test)

这样的设计使得学习成本低,模型之间的切换非常方便。

预处理工具

数据准备是机器学习的基础环节,scikit-learn提供了一系列实用的工具:

特征缩放:StandardScaler、MinMaxScaler等,用于数据标准化和归一化,提高模型表现。

特征编码:如OneHotEncoder,将类别变量转换为数值特征。

特征选择:如SelectKBest、RFE,帮助筛除无用或冗余特征。

特征转换:如多项式特征生成(PolynomialFeatures),增强模型的表达能力。

数据拆分:train_test_split()方便地实现训练集和测试集的划分。

模型评估与调优

完善的模型调优和验证机制确保模型的泛化能力:

交叉验证:cross_val_score、GridSearchCV等,能多次验证模型性能,避免过拟合。

参数调优:通过网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)自动寻找最佳参数组合。

性能指标:支持多种评估指标,例如准确率、精确率、召回率、F1值、均方误差(MSE)等,方便全面评估模型表现。

核心模块

  1. sklearn.preprocessing——数据预处理与特征工程

简介: 负责对原始数据进行标准化、归一化、编码等处理,为模型提供干净、标准的输入。

案例: 将特征进行标准化,使其具有均值0,方差1。

from sklearn.preprocessing import StandardScaler
import numpy as np

X = np.array([[0, 0], [1, 1], [2, 2]])

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)

  1. sklearn.model_selection——模型选择与验证(交叉验证、网格搜索)

简介: 提供拆分验证集、交叉验证、参数调优(网格搜索和随机搜索)的工具。

案例: 使用网格搜索调优支持向量机的参数C和核函数。

from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

iris = datasets.load_iris()
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
svc = SVC()
grid_search = GridSearchCV(svc, param_grid, cv=3)
grid_search.fit(iris.data, iris.target)

print("最佳参数:", grid_search.best_params_)

  1. sklearn.linear_model——线性模型(回归和分类)

简介: 包含多种线性回归和分类模型,适合解释性强的线性关系。

案例: 线性回归预测房价。

from sklearn.linear_model import LinearRegression
import numpy as np

# 模拟数据:面积与价格
X = np.array([[1000], [1500], [2000], [2500]])
y = np.array([200000, 250000, 300000, 350000])

model = LinearRegression()
model.fit(X, y)
print("回归系数:", model.coef_)
print("截距:", model.intercept_)

# 预测
print("面积为1800的房价预测:", model.predict([[1800]]))

  1. sklearn.tree——决策树与随机森林

简介: 实现树模型,支持分类和回归,随机森林是多棵树的集成。

案例: 使用随机森林进行分类。

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

iris = load_iris()
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(iris.data, iris.target)

# 预测
print("预测类别:", clf.predict([[5.0, 3.5, 1.3, 0.2]]))

  1. sklearn.svm——支持向量机

简介: 支持向量机适合复杂边界的分类和回归。

案例: 用SVM进行二分类。

from sklearn import svm
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X = iris.data
y = iris.target

# 只使用两个类别
X = X[y != 2]
y = y[y != 2]

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

clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)

print("准确率:", clf.score(X_test, y_test))

  1. sklearn.cluster——聚类算法

简介: 无监督学习,用于数据分组。

案例: 使用K-means进行数据聚类。

from sklearn.cluster import KMeans
import numpy as np

X = np.random.rand(10, 2)  # 随机生成数据

kmeans = KMeans(n_clusters=2, random_state=0)
labels = kmeans.fit_predict(X)

print("聚类标签:", labels)

  1. sklearn.metrics——模型性能评估指标

简介: 提供各种性能评价指标。

案例: 计算分类模型的准确率

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print("准确率:", accuracy_score(y_test, y_pred))

  1. 其他模块示例(如sklearn.decomposition——降维)

简介: 用于数据降维、特征提取。

案例: 利用PCA进行数据降维。

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

iris = load_iris()
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(iris.data)
print("原始维度:", iris.data.shape)
print("降维后:", X_reduced.shape)

常用算法

线性回归(LinearRegression)

参数名称 默认值 作用描述
fit_intercept True 是否计算截距项
normalize False 是否对输入特征进行归一化(已废弃,使用StandardScaler等预处理)
copy_X True 是否复制输入数据
n_jobs None 并行运行的作业数(Python 3.0以上支持)

逻辑回归(LogisticRegression)

参数名称 默认值 作用描述
penalty ‘l2’ 正则化类型:‘l1’, ‘l2’, ‘elasticnet’, 或 ‘none’
C 1.0 正则化强度的倒数,较小值表示更强正则化
solver ‘lbfgs’ 求解算法:‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’
max_iter 100 最大迭代次数
class_weight None / ‘balanced’ 类别权重,解决类别不平衡问题
multi_class ‘auto’ / ‘ovr’ / ‘multinomial’ 多类别策略

支持向量机(SVC、SVR)

参数名称 默认值 作用描述
C 1.0 错误项惩罚系数,越大越拟合训练集,可能过拟合
kernel ‘rbf’ 核函数类型:‘linear’, ‘poly’, ‘rbf’, 'sigmoid’等
degree 3 多项式核的次数(仅在 kernel=‘poly’ 时使用)
gamma ‘scale’ / ‘auto’ 核函数的系数,影响决策边界
coef0 0.0 核函数中的常数项(‘poly’ 和 ‘sigmoid’ 时有用)
shrinking True 是否启用启发式收缩
probability False 是否启用概率估计,训练时间会变长

决策树(DecisionTreeClassifier、DecisionTreeRegressor)

参数名称 默认值 作用描述
criterion ‘gini’ / ‘entropy’(分类) / ‘mse’(回归) 节点划分的度量标准
max_depth None 树的最大深度,控制模型复杂度
min_samples_split 2 内部分裂所需的最小样本数
min_samples_leaf 1 叶子节点最少样本数
max_features None 寻找最佳划分时考虑的特征数
max_leaf_nodes None 最大叶子数限制

随机森林(RandomForestClassifier、RandomForestRegressor)

参数名称 默认值 作用描述
n_estimators 100 森林中树的数量
criterion ‘gini’ / ‘entropy’(分类) / ‘mse’(回归) 划分标准
max_depth None 树的最大深度
min_samples_split 2 内部分裂的最小样本数
min_samples_leaf 1 叶子节点的最小样本数
max_features ‘auto’ / ‘sqrt’ / ‘log2’ 每次划分考虑的最大特征数
bootstrap True 是否使用Bootstrap采样

K近邻(KNeighborsClassifier、KNeighborsRegressor)

参数名称 默认值 作用描述
n_neighbors 5 邻居的数量
weights ‘uniform’ / ‘distance’ 投票权重:均匀或距离倒数
algorithm ‘auto’ 选择最近邻搜索算法(‘ball_tree’, ‘kd_tree’, ‘brute’)
leaf_size 30 数据结构叶节点大小
p 2 Minkowski距离的p值,p=2为欧氏距离

聚类:K-means(KMeans)、层次聚类

参数名称 默认值 作用描述
n_clusters 8 聚类的簇数
init ‘k-means++’ 初始化方法
max_iter 300 最大迭代次数
n_init 10 初始聚类中心的重复运行次数
random_state None 随机数种子

典型应用场景

  1. 数据预处理和特征工程

场景: 处理一个带有不同量纲和类别变量的数据集,为建模做准备。

案例: 使用标准化和独热编码

import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# 假设数据
df = pd.DataFrame({
    '年龄': [25, 32, 47],
    '收入': [50000, 64000, 120000],
    '性别': ['男', '女', '女']
})

# 数值特征
numeric_features = ['年龄', '收入']
# 类别特征
categorical_features = ['性别']

# 构建预处理管道
preprocessor = ColumnTransformer(transformers=[
    ('num', StandardScaler(), numeric_features),
    ('cat', OneHotEncoder(), categorical_features)
])

X_processed = preprocessor.fit_transform(df)
print(X_processed)

  1. 构建分类模型(如垃圾邮件检测)

场景: 使用文本特征识别垃圾邮件。

案例: 文本特征提取 +逻辑回归

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline

# 示例文本数据
emails = ['免费优惠,赶快领取', '会议通知,明天开会', '赚大钱,点击链接']
labels = [1, 0, 1]  # 1为垃圾邮件,0非垃圾

# 构建流程
model = Pipeline([
    ('vectorizer', CountVectorizer()),
    ('classifier', LogisticRegression())
])

model.fit(emails, labels)
print("预测新邮件:", model.predict(['免费领取大奖']))

  1. 回归预测(如房价预测)

场景: 根据房屋特征预测房价。

案例: 使用线性回归建模

from sklearn.linear_model import LinearRegression
import numpy as np

# 特征(面积、房龄)
X = np.array([[1000, 5], [1500, 3], [2000, 10]])
# 价格
y = np.array([300000, 400000, 500000])

model = LinearRegression()
model.fit(X, y)

# 预测一套面积为1800,房龄2年的房子价格
predicted_price = model.predict([[1800, 2]])
print("预测房价:", predicted_price)

  1. 聚类分析(如客户分群)

场景: 根据客户的购物行为进行自动分组。

案例: 使用K-means

from sklearn.cluster import KMeans
import numpy as np

# 模拟客户特征:年消费金额、购物频率
data = np.array([
    [5000, 10],
    [7000, 15],
    [20000, 2],
    [22000, 3]
])

kmeans = KMeans(n_clusters=2, random_state=0)
labels = kmeans.fit_predict(data)
print("客户分类:", labels)

  1. 降维(如主成分分析PCA)

场景: 将高维数据可视化。

案例: 在手写数字数据集上应用PCA降至2维

from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

digits = load_digits()
X = digits.data

pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

plt.scatter(X_reduced[:,0], X_reduced[:,1], c=digits.target, cmap='tab10')
plt.colorbar()
plt.title("Digit Data PCA降维后散点图")
plt.show()

  1. 模型验证与调优

场景: 使用交叉验证和网格搜索优化模型参数。

案例: 调节支持向量机的参数

from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

iris = datasets.load_iris()
param_grid = {
    'C': [0.1, 1, 10],
    'kernel': ['linear', 'rbf']
}
svc = SVC()
clf = GridSearchCV(svc, param_grid, cv=5)
clf.fit(iris.data, iris.target)
print("最佳参数:", clf.best_params_)

安装与使用

pip install scikit-learn

# 简单案例
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化模型
clf = LogisticRegression()

# 训练模型
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 评估
print("准确率:", accuracy_score(y_test, y_pred))

练习题

  1. 数据预处理

题: 使用StandardScaler对以下数据进行标准化处理:

import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6]])

# 答案
from sklearn.preprocessing import StandardScaler
import numpy as np

X = np.array([[1, 2], [3, 4], [5, 6]])
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)

  1. 构建模型

题: 使用LogisticRegression对鸢尾花数据(load_iris)进行训练,并输出模型的准确率。

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=42)

model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))

  1. 交叉验证

题: 利用cross_val_score对支持向量机(SVC)在鸢尾花数据集上进行5折交叉验证,打印平均得分。

from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris

iris = load_iris()
scores = cross_val_score(SVC(), iris.data, iris.target, cv=5)
print("平均得分:", scores.mean())

  1. 核心参数调优

题: 使用GridSearchCV调优SVC的C参数(取值范围为[0.1, 1, 10])和核函数(‘linear’和’rbf’),找出最佳参数组合。

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris

iris = load_iris()
param_grid = {
    'C': [0.1, 1, 10],
    'kernel': ['linear', 'rbf']
}
grid = GridSearchCV(SVC(), param_grid, cv=5)
grid.fit(iris.data, iris.target)
print("最优参数:", grid.best_params_)

  1. K-均值聚类

题: 使用KMeans将以下二维随机数据分为2类:

np.random.seed(0)
X = np.random.randn(10, 2)

from sklearn.cluster import KMeans
import numpy as np

np.random.seed(0)
X = np.random.randn(10, 2)
kmeans = KMeans(n_clusters=2, random_state=0)
labels = kmeans.fit_predict(X)
print("样本类别标签:", labels)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐