scikit-learn入门与基础概念

1. scikit-learn简介

scikit-learn是一个Python机器学习库,提供简单高效的数据挖掘和数据分析工具。它基于NumPy、SciPy和Matplotlib构建,是机器学习领域最受欢迎的开源库之一。

1.1 scikit-learn的历史

  • 2010年:scikit-learn项目启动,最初名为scikits.learn
  • 2011年:发布第一个稳定版本
  • 2012年:成为NumFOCUS基金会的项目
  • 2023年:发布1.4版本,增强了多项功能

1.2 scikit-learn的特点

  • 易于使用:提供简洁一致的API接口
  • 功能丰富:包含多种监督和无监督学习算法
  • 高性能:基于NumPy和SciPy的高效实现
  • 可扩展:支持自定义算法和模型
  • 文档完善:详细的文档和示例

2. 安装scikit-learn

2.1 安装依赖

scikit-learn依赖于以下库:

  • NumPy:用于数值计算
  • SciPy:用于科学计算
  • Matplotlib:用于数据可视化
  • joblib:用于并行计算

2.2 安装方法

使用pip安装:

pip install scikit-learn

使用conda安装:

conda install scikit-learn

2.3 验证安装

import sklearn
print(sklearn.__version__)

3. 核心概念

3.1 估计器(Estimator)

估计器是scikit-learn中最核心的概念,用于拟合数据和进行预测。所有的机器学习算法都实现为估计器。

from sklearn.linear_model import LinearRegression

# 创建估计器实例
model = LinearRegression()

# 拟合数据
model.fit(X_train, y_train)

# 预测
predictions = model.predict(X_test)

3.2 转换器(Transformer)

转换器用于数据预处理和特征工程,实现了fittransform方法。

from sklearn.preprocessing import StandardScaler

# 创建转换器实例
scaler = StandardScaler()

# 拟合数据
scaler.fit(X_train)

# 转换数据
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

3.3 评估器(Evaluator)

评估器用于评估模型性能,实现了score方法。

from sklearn.metrics import accuracy_score

# 计算准确率
accuracy = accuracy_score(y_test, predictions)
print(f"准确率: {accuracy}")

4. 基本工作流程

scikit-learn的典型工作流程包括以下步骤:

  1. 数据准备:加载和预处理数据
  2. 数据分割:将数据分为训练集和测试集
  3. 模型选择:选择合适的机器学习算法
  4. 模型训练:使用训练数据拟合模型
  5. 模型评估:使用测试数据评估模型性能
  6. 模型调优:调整模型参数以提高性能
  7. 模型部署:将模型应用于实际场景

4.1 数据准备

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

# 加载内置数据集
iris = load_iris()
X = iris.data
y = iris.target

# 转换为DataFrame
df = pd.DataFrame(X, columns=iris.feature_names)
df['target'] = y

4.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, random_state=42)

4.3 模型选择与训练

from sklearn.tree import DecisionTreeClassifier

# 创建模型
model = DecisionTreeClassifier()

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

4.4 模型评估

from sklearn.metrics import classification_report, confusion_matrix

# 预测
y_pred = model.predict(X_test)

# 评估
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

5. 常用算法

5.1 分类算法

  • 决策树DecisionTreeClassifier
  • 随机森林RandomForestClassifier
  • 支持向量机SVC
  • K最近邻KNeighborsClassifier
  • 朴素贝叶斯GaussianNB

5.2 回归算法

  • 线性回归LinearRegression
  • 岭回归Ridge
  • LASSO回归Lasso
  • 弹性网络ElasticNet
  • 决策树回归DecisionTreeRegressor

5.3 聚类算法

  • K均值KMeans
  • 层次聚类AgglomerativeClustering
  • DBSCANDBSCAN
  • 谱聚类SpectralClustering

5.4 降维算法

  • 主成分分析PCA
  • 线性判别分析LDA
  • t-SNETSNE

6. 特征工程

6.1 特征预处理

from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 归一化
min_max_scaler = MinMaxScaler()
X_normalized = min_max_scaler.fit_transform(X)

# 独热编码
encoder = OneHotEncoder()
categorical_features = encoder.fit_transform(categorical_data)

6.2 特征选择

from sklearn.feature_selection import SelectKBest, chi2

# 选择K个最佳特征
selector = SelectKBest(chi2, k=2)
X_new = selector.fit_transform(X, y)

7. 模型评估与调优

7.1 交叉验证

from sklearn.model_selection import cross_val_score

# 交叉验证
scores = cross_val_score(model, X, y, cv=5)
print(f"交叉验证得分: {scores}")
print(f"平均得分: {scores.mean()}")

7.2 网格搜索

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {'max_depth': [3, 5, 7], 'min_samples_split': [2, 4, 6]}

# 网格搜索
grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 最佳参数
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳得分: {grid_search.best_score_}")

8. 实战示例:鸢尾花分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

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

# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy}")

9. 总结

scikit-learn是一个功能强大、易于使用的机器学习库,提供了丰富的算法和工具,适用于各种机器学习任务。通过本教程的学习,你已经了解了scikit-learn的基本概念、核心组件和使用方法,可以开始使用它来解决实际的机器学习问题。

在后续的教程中,我们将深入探讨scikit-learn的高级特性和应用场景,帮助你更全面地掌握这个强大的机器学习库。