Python数据挖掘之 scikit-learn(简版)
scikit-learn(简称sklearn)是一个基于Python的开源机器学习库,其设计目标是让机器学习变得更简单、更高效。自2007年由法国INRIA研究所的David Cournapeau首次提出并开发以来,scikit-learn经历了多次版本更新,逐步成为数据科学和人工智能领域最受欢迎的工具之一。
介绍
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)等,方便全面评估模型表现。
核心模块
- 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)
- 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_)
- 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]]))
- 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]]))
- 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))
- 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)
- 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))
- 其他模块示例(如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 | 随机数种子 |
典型应用场景
- 数据预处理和特征工程
场景: 处理一个带有不同量纲和类别变量的数据集,为建模做准备。
案例: 使用标准化和独热编码
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)
- 构建分类模型(如垃圾邮件检测)
场景: 使用文本特征识别垃圾邮件。
案例: 文本特征提取 +逻辑回归
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(['免费领取大奖']))
- 回归预测(如房价预测)
场景: 根据房屋特征预测房价。
案例: 使用线性回归建模
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)
- 聚类分析(如客户分群)
场景: 根据客户的购物行为进行自动分组。
案例: 使用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)
- 降维(如主成分分析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()
- 模型验证与调优
场景: 使用交叉验证和网格搜索优化模型参数。
案例: 调节支持向量机的参数
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))
练习题
- 数据预处理
题: 使用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)
- 构建模型
题: 使用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))
- 交叉验证
题: 利用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())
- 核心参数调优
题: 使用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_)
- 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)
更多推荐
所有评论(0)