机器学习-sklearn库-classification,classifer comparison代码分析

本文展示了如何使用Python的sklearn库中的各种分类器(如KNN、SVM、随机森林等)在不同数据集(如moonshapes、circles和线性可分数据)上进行训练、测试和可视化决策边界。作者强调了sklearn库的封装、数据预处理、模型评估和matplotlib在数据可视化的应用。
摘要由CSDN通过智能技术生成

 


import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

from sklearn.datasets import make_circles, make_classification, make_moons
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

# 分类器模型,依次是 最近邻分类,线性支持向量机,径向量函数支持向量机,高斯过程分类器,决策树分类器
# 随机森林分类器,神经网络分类器,AdaBoost分类器,朴素贝叶斯分类器,二次判别分析分类器
names = [
    "Nearest Neighbors",
    "Linear SVM",
    "RBF SVM",
    "Gaussian Process",
    "Decision Tree",
    "Random Forest",
    "Neural Net",
    "AdaBoost",
    "Naive Bayes",
    "QDA",
]

# 每种分类器在sklearn库中都对应着一个类,初始化类,对应着一些参数
classifiers = [
    KNeighborsClassifier(3),
    SVC(kernel="linear", C=0.025, random_state=42),
    SVC(gamma=2, C=1, random_state=42),
    GaussianProcessClassifier(1.0 * RBF(1.0), random_state=42),
    DecisionTreeClassifier(max_depth=5, random_state=42),
    RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1, random_state=42
    ),
    MLPClassifier(alpha=1, max_iter=1000, random_state=42),
    AdaBoostClassifier(random_state=42),
    GaussianNB(),
    QuadraticDiscriminantAnalysis(),
]

# 生成可分类随机数据集
# 参数如下,数据集特征数量为2,冗余特征为0,有效特征数为2,随机种子数为1,每个类别中簇的数量为1
# 返回一个包含两个元素的元组,分别是生成的数据集和对应的标签。
X, y = make_classification(
    n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1
)

# 上述方法生成的随机点属于不同类的簇过于分散,所以进行如下处理,更好的测试分类器的性能
rng = np.random.RandomState(2)  # 生成一种随机模式
X += 2 * rng.uniform(size=X.shape)  # 对于X中的每个点每维坐标加减0-1之间的随机数,分散些,但又不能过于分散
linearly_separable = (X, y)  # 构建一个线性可分的数据集

# 生成三种数据集(月亮形状的二分类数据,环形的二分类数据),适当添加噪声值数据更贴合实际
# 这些数据集的特征数都是2,都可以在笛卡尔坐标系中进行表示,看作点集
datasets = [
    make_moons(noise=0.3, random_state=0),
    make_circles(noise=0.2, factor=0.5, random_state=1),
    linearly_separable,
]

# 初始化画板
figure = plt.figure(figsize=(27, 9))
i = 1

# 开始处理数据集 ds_cnt是索引值,ds是数据(特征+标签),分别处理三种数据集
for ds_cnt, ds in enumerate(datasets):

    # 处理数据集,X是特指值,y是标签
    X, y = ds

    # 利用sklearn提供的train_test_split方法来分割训练集和测试集(比例是4-6)
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.4, random_state=42
    )

    # 计算这些点集(x,y)的最小值和最大值,
    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5

    # 利用Matplotlib 库中的一种颜色映射
    cm = plt.cm.RdBu
    # 红色 和 蓝色
    cm_bright = ListedColormap(["#FF0000", "#0000FF"])
    # 选定指定子图
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
    # 第一行
    if ds_cnt == 0:
        ax.set_title("Input data")

    # 标出训练用点,颜色较深
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors="k")

    # 标出测试用点,颜色较浅(alpha=0.3)
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.3, edgecolors="k")

    # 设定坐标图的边界
    ax.set_xlim(x_min, x_max)
    ax.set_ylim(y_min, y_max)

    # 设定坐标轴不显示参数
    ax.set_xticks(())
    ax.set_yticks(())

    i += 1

    # 匹配分类器模型
    for name, clf in zip(names, classifiers):
        # 选定指定子图
        ax = plt.subplot(len(datasets), len(classifiers) + 1, i)

        # 封装进管道,处理方便
        # 接受转换器StandardScaler() 和 估计器 clf 作为输入
        clf = make_pipeline(StandardScaler(), clf)
        # 调用fit方法进行拟合
        clf.fit(X_train, y_train)
        # 直接用score方法进行评分
        score = clf.score(X_test, y_test)

        # 决策边界的显示
        DecisionBoundaryDisplay.from_estimator(
            clf, X, cmap=cm, alpha=0.8, ax=ax, eps=0.5
        )

        # 标出训练点
        ax.scatter(
            X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors="k"
        )

        # 标出测试点
        ax.scatter(
            X_test[:, 0],
            X_test[:, 1],
            c=y_test,
            cmap=cm_bright,
            edgecolors="k",
            alpha=0.6,
        )

        # 设定边界
        ax.set_xlim(x_min, x_max)
        ax.set_ylim(y_min, y_max)

        # 取消坐标读数
        ax.set_xticks(())
        ax.set_yticks(())

        # 子图命名
        if ds_cnt == 0:
            ax.set_title(name)
        # 打上分数的标签
        ax.text(
            x_max - 0.3,
            y_min + 0.3,
            ("%.2f" % score).lstrip("0"),
            size=15,
            horizontalalignment="right",
        )
        i += 1
# 展示
plt.tight_layout() # 自动调整子图间的间距,美观
plt.show()

心得:

1.sklearn库对大部分的机器学习算法都进行封装成类,直接调用即可。

2.对某个模型的使用,都有个大致的步骤。首先是数据处理(划分训练集,测试集等),其次就是调用模型的fit,对训练集进行拟合,再其次考虑利用matplotlib进行数据可视化,predict对测试集预测,score可给出模型评分等一些列操作。

3.管道的使用,pipeline是sklearn封装的一个类,传入数据预处理方式,以及机器学习模型,更加方便的对机器学习模型的调用。

4.matplotlib的使用对于机器学习的数据可视化提供了非常大的便利,熟悉常用的绘图语句是很有必要的。

5.在自己手写模型算法的时候,如果要使用某些数据进行拟合,分析模型。sklearn库也提供了多种类型数据的生成算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值