Python机器学习:Scikit-learn入门指南

一、Scikit-learn简介

1. Scikit-learn是什么

Scikit-learn 是基于 Python 语言的机器学习工具库,它提供了诸如分类、回归、聚类等常用机器学习任务的 API,同时提供了许多常用的数据预处理工具和数据可视化工具。Scikit-learn 的设计旨在与 NumPy、SciPy 和 matplotlib 工具一起使用,因此可以轻松地与这些库进行集成。

2. Scikit-learn的优势及应用场景

Scikit-learn 提供了丰富成熟且易于使用的算法和工具,适用于各种机器学习任务。Scikit-learn 能够实现从数据预处理到模型选择、训练和评估等完整的机器学习工作流程。它也广泛应用于数据挖掘、预测建模、机器视觉、自然语言处理等领域。

3. Scikit-learn的安装

你可以使用 pip 命令通过以下命令来安装 Scikit-learn:

pip install -U scikit-learn

二、数据准备

1. 数据特征

在这个环节中需要根据你的具体任务首先对数据进行探查和描述,以确定哪些特征和标准可以用于构建模型。你可以使用 Pandas 库来加载数据集到 DataFrame 中,然后通过 head、describe 等方法来了解数据的基本情况:

import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 预览数据
print(df.head())

# 描述数据
print(df.describe())

2. 数据清洗

在数据清洗阶段中我们会删除无用的列、处理缺失的数据和异常值等。可以使用 Pandas 库的 drop、fillna 等方法来处理数据:

import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 删除无用的列
df = df.drop(['id', 'timestamp'], axis=1)

# 处理缺失的数据
df = df.fillna(df.mean())

# 处理异常值
df = df[(df['value'] >= 0) & (df['value'] <= 100)]

3. 数据划分

在机器学习任务中通常需要将数据集划分为训练集和测试集。你可以使用 Scikit-learn 库来进行数据划分:

from sklearn.model_selection import train_test_split
import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 删除无用的列
df = df.drop(['id', 'timestamp'], axis=1)

# 处理缺失的数据
df = df.fillna(df.mean())

# 处理异常值
df = df[(df['value'] >= 0) & (df['value'] <= 100)]

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('label', axis=1), df['label'], random_state=42)

三、模型训练

1. 模型选择

在模型选择环节中需要根据任务的性质、数据的分布以及性能需求等选择最适合的模型。Scikit-learn 提供了许多常用的机器学习算法,我们可以从中选择适合我们任务的算法,比如:

from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier

clf1 = SVC()
clf2 = KNeighborsClassifier()
clf3 = RandomForestClassifier()

2. 模型训练

选定好模型后需要使用训练数据来训练模型。Scikit-learn 提供了 fit 方法来进行模型训练:

from sklearn.svm import SVC
import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 删除无用的列
df = df.drop(['id', 'timestamp'], axis=1)

# 处理缺失的数据
df = df.fillna(df.mean())

# 处理异常值
df = df[(df['value'] >= 0) & (df['value'] <= 100)]

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('label', axis=1), df['label'], random_state=42)

# 初始化 SVM 模型
clf = SVC(kernel='linear', C=1)

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

3. 模型评估

在模型评估环节中需要使用测试集来评估模型的性能。Scikit-learn 提供了 score 方法和混淆矩阵等评估方法:

from sklearn.metrics import accuracy_score, confusion_matrix

# 用测试集评估模型的性能
y_pred = clf.predict(X_test)
print('Accuracy:', accuracy_score(y_test, y_pred))
print('Confusion Matrix:', confusion_matrix(y_test, y_pred))

四、机器学习算法

1. 监督学习算法

1.1 线性回归

线性回归模型是一种对于线性关系建模的机器学习算法。它可用于预测连续的数值型变量如销售额、股票价格等。下面是一个使用 scikit-learn 库实现线性回归的示例:

from sklearn.linear_model import LinearRegression

# 建立线性回归模型
model = LinearRegression()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

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

# 预测结果
y_pred = model.predict(X_test)

1.2 逻辑回归

逻辑回归模型是一种对于二分类问题建模的机器学习算法。它可用于预测一个事件发生的概率。下面是一个使用 scikit-learn 库实现逻辑回归的示例:

from sklearn.linear_model import LogisticRegression

# 建立逻辑回归模型
model = LogisticRegression()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

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

# 预测结果
y_pred = model.predict(X_test)

1.3 决策树

决策树是一种基于树形结构进行决策的机器学习算法。它可用于分类和回归问题其优点在于易于理解和解释。下面是一个使用 scikit-learn 库实现决策树的示例:

from sklearn.tree import DecisionTreeClassifier

# 建立决策树模型
model = DecisionTreeClassifier(max_depth=2)

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

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

# 预测结果
y_pred = model.predict(X_test)

1.4 支持向量机

支持向量机是一种基于边际最大化进行分类的机器学习算法。它可用于分类和回归问题其优点在于高准确性和鲁棒性。下面是一个使用 scikit-learn 库实现支持向量机的示例:

from sklearn.svm import SVC

# 建立支持向量机模型
model = SVC(kernel='linear')

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

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

# 预测结果
y_pred = model.predict(X_test)

1.5 随机森林

随机森林是一种基于决策树进行分类和回归的机器学习算法。它可用于处理高维度和大规模数据集。下面是一个使用 scikit-learn 库实现随机森林的示例:

from sklearn.ensemble import RandomForestClassifier

# 建立随机森林模型
model = RandomForestClassifier(n_estimators=100)

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

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

# 预测结果
y_pred = model.predict(X_test)

2. 非监督学习算法

2.1 主成分分析

主成分分析是一种用于数据降维的机器学习算法。它通过线性变换将高维度数据转换为低维度数据,并且保留了大多数的变异性。下面是一个使用 scikit-learn 库实现主成分分析的示例:

from sklearn.decomposition import PCA

# 建立主成分分析模型
model = PCA(n_components=2)

# 将数据转化为低维度
X_pca = model.fit_transform(X)

2.2 聚类分析

聚类分析是一种用于将数据集分组的机器学习算法。它可用于发现数据集中的不同模式和群组。下面是一个使用 scikit-learn 库实现聚类分析的示例:

from sklearn.cluster import KMeans

# 建立聚类分析模型
model = KMeans(n_clusters=3)

# 训练模型
model.fit(X)

# 预测结果
y_pred = model.predict(X)

五、实战案例

1. 分类问题

一个使用决策树算法处理鸢尾花分类问题的示例:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 导入鸢尾花数据集
iris = load_iris()

# 建立决策树分类模型
model = DecisionTreeClassifier()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)

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

# 预测结果
y_pred = model.predict(X_test)

# 计算准确率
print('Accuracy:', accuracy_score(y_test, y_pred))

2. 回归问题

一个使用随机森林算法处理波士顿房价回归问题的示例:

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

# 导入波士顿房价数据集
boston = load_boston()

# 建立随机森林回归模型
model = RandomForestRegressor()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=0)

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

# 预测结果
y_pred = model.predict(X_test)

# 计算平均绝对误差
print('MAE:', mean_absolute_error(y_test, y_pred))

六、Scikit-learn进阶

1. 流水线

当我们需要处理的数据非常庞大时很容易将数据导入,并挑选和训练不同的模型。在这些过程中可能需要对数据进行预处理,如标准差规范化或者归一化等。Scikit-learn提供了一个Pipeline API,让我们可以将整个过程用代码整合起来,方便调用。

以下是一个流水线示例:

from sklearn.pipeline import Pipeline
from sklearn.feature_selection import SelectKBest
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris

# 导入鸢尾花数据集
iris = load_iris()

# 建立Pipeline
pipeline = Pipeline([
    ('reduce_dim', PCA()),
    ('classify', LogisticRegression())
])

# 建立参数搜索空间
param_grid = {
    
    
    'reduce_dim__n_components': [2, 4, 8],
    'classify__C': [0.1, 1, 10]
}

# 在流水线中使用GridSearchCV调整参数
grid = GridSearchCV(pipeline, cv=5, n_jobs=-1, param_grid=param_grid)
grid.fit(iris.data, iris.target)

# 输出最佳参数
print(grid.best_params_)

2. 模型调参

当我们使用Scikit-learn中的某个模型时需要对该模型的超参数进行适当的调整,以获得最佳表现。Scikit-learn中提供了不同的调整方法,如Grid Search和Random Search等。具体使用哪种方法取决于数据的规模和要求。

以下是一个使用Grid Search调整模型的示例:

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error

# 导入波士顿房价数据集
boston = load_boston()

# 建立随机森林回归模型
model = RandomForestRegressor()

# 建立参数搜索空间
param_grid = {
    
    
    'n_estimators': [10, 50, 100],
    'max_depth': [None, 2, 5]
}

# 在模型中使用GridSearchCV调整参数
grid = GridSearchCV(model, cv=5, n_jobs=-1, param_grid=param_grid)
grid.fit(boston.data, boston.target)

# 预测结果
y_pred = grid.predict(boston.data)

# 计算平均绝对误差
print('MAE:', mean_absolute_error(boston.target, y_pred))

3. 特征选择

在实际应用中不是所有的特征都具有相同的重要性。有些特征可能比其他特征更具有预测性。特征选择是一个用于选择最重要的特征的技术。Scikit-learn提供了很多特征选择工具,如SelectKBest、Recursive Feature Elimination和SelectFromModel等。

以下是一个使用SelectKBest选择特征的示例:

from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

# 导入波士顿房价数据集
boston = load_boston()

# 选择最重要的5个特征
selector = SelectKBest(f_regression, k=5)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=0)

# 选择特征
X_train_selected = selector.fit_transform(X_train, y_train)
X_test_selected = selector.transform(X_test)

# 建立线性回归模型
model = LinearRegression()

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

# 预测结果
y_pred = model.predict(X_test_selected)

# 计算平均绝对误差
print('MAE:', mean_absolute_error(y_test, y_pred))

七、小结回顾

1. Scikit-learn的优缺点

Scikit-learn具有以下优点:

  • 它具有用于一般机器学习问题的全面工具包;
  • 几乎所有的算法都可以通过统一的API来使用,使用户能够更好地理解和使用这些算法;
  • 具有大量的文档和示例,使得使用Scikit-learn变得更为简单易用;
  • 它对分布式计算的支持很好,可以轻松地扩展到大规模数据集;
  • Scikit-learn的代码是开源的。

Scikit-learn也有一些缺点:

  • 由于它依赖于Python,因此相对于C++或Java等语言,Scikit-learn运行效率较低;
  • 它尚未完全支持大规模深度学习模型。

2. 未来发展方向

随着人工智能的发展机器学习和数据科学也将取得进一步发展。Scikit-learn将继续是许多人入门机器学习的重要工具之一。在未来,我们可以期待更多的算法被添加到Scikit-learn工具包中,并且它会更好地支持大规模和高性能计算。

猜你喜欢

转载自blog.csdn.net/u010349629/article/details/130663015