sklearn之——简单上手

…代码源自老师,记在CSDN上分析一下,目的就是理清sklearn的上手方法。方便大家查看,忘了的时候回来看一下。

源代码
明确一下我们的目的:了解机器学习在数据科学中的典型应用。
实现方法:选择支持向量机,决策树,朴素贝叶斯算法。
利用:python中的sklearn

首先先给我们将要实现的三个分类算法起三个名字:

names = ["Linear SVM", "Decision Tree", "Naive Bayes"]
# 其实我一直想叫它天真贝叶斯。。。

然后就要设置我们想要设置的分类器了。在这里我们要import三个库:

from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
classifiers = [
    SVC(kernal="Linear", C=0.025),
    DecisionTreeClassifier(max_depth=5),
    GaussianNB()]

C: 惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。
C越大,相当于惩罚松弛变量,希望松弛变量接近0,
即对误分类的惩罚增大,趋向于对训练集全分对的情况,准确率很高,但泛化能力弱,容易导致过拟合。
C值小,对误分类的惩罚减小,容错能力增强,泛化能力较强,但也可能欠拟合

kernel: 算法中采用的核函数类型,核函数是用来将非线性问题转化为线性问题的一种方法。
参数选择有RBF, Linear, Poly, Sigmoid,precomputed或者自定义一个核函数, 默认的是"RBF",即径向基核,也就是高斯核函数;
而Linear指的是线性核函数,Poly指的是多项式核,Sigmoid指的是双曲正切函数tanh核;
因为这里用到的是线性支持向量机,所以设置为linear

max_depth: 决策树最大深度。
数据类型int or None, optional (default=None)
一般来说,数据少或者特征少的时候可以不管这个值。
如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。
常用的可以取值10-100之间。常用来解决过拟合

在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。
分别是GaussianNB,MultinomialNB和BernoulliNB。
其中GaussianNB就是先验为高斯分布的朴素贝叶斯,
MultinomialNB就是先验为多项式分布的朴素贝叶斯,
而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

这三个类适用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。
如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。
而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。

接下来我们需要生成一个用于分类的数据集 这里设置为线性可分的数据集,输入变量设置为两个特征:X, y。(之前看莫烦的教程上也是用X,y而不是用X,Y或者x, y表示不知道为什么,希望有人知道可以告诉我🙇‍)。这时我们也需要导入一个制作数据集库datasets

from sklearn.datasets import make_classification
X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,
                           random_state=1, n_clusters_per_class=1)
                           '''
n_features :特征个数= n_informative() + n_redundant + n_repeated
n_informative:多信息特征的个数
n_redundant:冗余信息,informative特征的随机线性组合
n_repeated :重复信息,随机提取n_informative和n_redundant 特征
n_classes:分类类别
n_clusters_per_class :某一个类别是由几个cluster构成的
'''

如果我们对这个datasets库不是很明白的话,我们可以进入https://scikit-learn.org/stable/modules/classes.html中查看。这其中有许多我们在各种教程中看到的比如,糖尿病数据集的使用:
在这里插入图片描述

# 我们就可以这么操作 
from sklearn import datasets
datasets = datasets.load_diabetes()

接着我们回过来进行测试:我们先设置一个伪随机数种子,然后再利用这个种子来对X进行扰动。

rng = np.random.RandomState(2) 
X += 2 * rng.uniform(size=X.shape)

然后再将上述得到的X,y构建成一个线性可分的数据集。

linearly_seprable = (X, y)

接着我们选择三个数据集,分别是make_moons, make_cycles, 以及前面的linearly_seprable。此时需要从datasets中导入两个人数据集:

from sklearn.datasets import make_moons, make_cycles
datasets = [make_moons(noises=0.1, random_state=0)

如果我们不清楚make_moons的参数,只需要点进去就可以看到它的全部参数,还可以去github上去看它的源代码,那里有着sklearn的许多开发者。在这里插入图片描述

如果此时我们想查看一下我们的数据集现在的内容的话,只要简单的print一下就可以:

print("make_moons:", make_moons(noise=0.1, random_state=0))
print("make_circles:", make_circles(noise=0.1, factor=0.5, random_state=1))
print("linearly_separable:", linearly_separable)
print("datasets:",  datasets)

接下来我们就要以图的i形式来展现我们的三种分类分类后的结果:
首先设置显示结果图的大小, 此时我们需要再导入一个绘图库matplotlib

import matplotlib.pyplot as plt
figure = plt.figure(figuresize=(27, 19))
i = 1

然后分别对每个数据集做训练及测试:
在这里我们要对数据进行标准化处理,因此需要导入train_test_split, 以及matlab的一些绘图库ListedColormap。这里我们训练的思想就是利用train_test_split函数来将数据集分割成训练集和测试集两个部分。这里我们选取60%的数据集用来训练,40%用来测试。

from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
for ds_cnt, ds in enumerate(datasets):
    # print("ds_cnt:", ds_cnt)
    # 处理数据集,每一个ds相当于每一个数据集,共三个数据集
    X, y = ds
    # print("ds:", ds)
    X = StandardScaler().fit_transform(X)  # 标准化数据
    # print("X:", X) #每一个X是100*2的二维数组
    # print("y:", y) #每一个y是100*1的二维数组
    X_train, X_test, y_train, y_test = \
        train_test_split(X, y, test_size=0.4, random_state=42)  # 分割数据集

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5  # 取X特征的第一个特征取值范围作为横轴
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5  # 取X特征的第二个特征取值范围作为纵轴

    h = .02  # 设置网格的步长
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),  # 按步长在横纵轴上设置网格
                         np.arange(y_min, y_max, h))
    # print("网格横轴:", xx)
    # print("网格纵轴:", yy)

    # 先展示输入数据集
    cm = ListedColormap((['red', 'blue']))  # 设置分割面的颜色
    cm_bright = ListedColormap(['#FF0000', '#0000FF'])  # 设置散点的颜色
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i)  # 划分子图
    # len(datasets)为数据集的个数,子图的行数,3个数据集,3行子图
    # len(calssifiers)为算法个数,共3种算法,原来生成的数据集,共4列
    # for ds_cnt, ds in enumerate(datasets):
    # ds_cnt取值为0,1,2,对每一个数据集画散点图
    if ds_cnt == 0:
        ax.set_title("Input data")
    # 画训练集散点,训练集用0标识,测试集用×标识,横轴为一维数据,纵轴为二维数据
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
               edgecolors='k', marker='o', label='train set')
    # 画测试集散点
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6,
               edgecolors='k', marker='x', label='test set')
    # 画坐标轴
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1
    # 处理下一个训练集

    # 分别对每个分类器做训练测试
    # 设置显示结果的图的标题
    # names = ["Linear SVM", "Decision Tree", "Naive Bayes"]
    # clsssifiers=[ SVC(kernel="linear", C=0.025),
    #     DecisionTreeClassifier(max_depth=5),
    #     GaussianNB()]
    for name, clf in zip(names, classifiers):
        # zip函数令算法名称和算法形成一一对应关系(“Linear SVM”,SVC)
        # (“"Decision Tree”,DecisionTreeClassifier,)
        # (""Naive Bayes", GaussianNB())
        # print("name:", name)
        # print("classifiers:", classifiers)
        # 每一种数据对应一行,每一种分类算法对应一列
        ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
        clf.fit(X_train, y_train)  # 训练集训练分类器
        score = clf.score(X_test, y_test)  # 测试集测试分类器

        # 画分类面和数据集点分布
        # 为了画出分类边界,我们用训练好的分类器对之前设置的网格每个点做分类
        if hasattr(clf, "decision_function"):
            # print("clf:", clf)
            # print("hasattr:", hasattr(clf, "decision_function"))
            # 打印结果全为True
            Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])  # ravel()函数用于展平数组
            # print("Z:", Z)

        else:
            Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]

        # 将分类结果利用contourf(等高线)函数画出
        Z = Z.reshape(xx.shape)
        ax.contourf(xx, yy, Z, cmap=cm, alpha=.4)

        # 画训练集点
        ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
                   edgecolors='k', marker='o', label='train set')
        # 画测试集点
        ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
                   edgecolors='k', marker='x', label='test set')

        # 画坐标轴
        ax.set_xlim(xx.min(), xx.max())
        ax.set_ylim(yy.min(), yy.max())
        ax.set_xticks(())
        ax.set_yticks(())
        if ds_cnt == 0:
            # 画子图标题
            # ds_cnt的取值为0,1,2意为每一个数据集的第1,2,3种算法,只有当每一个数据集的第一种算法时才会画子图标题
            ax.set_title(name)
            # names = ["Linear SVM", "Decision Tree", "Naive Bayes"]
        # 显示测试准确率
        #  score = clf.score(X_test, y_test)  # 测试集测试分类器
        ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),
                size=20, horizontalalignment='right')
        i += 1
        # 子图的计数方法为:图像从左到右,从上到下排列

最后画图显示,结束!

plt.tight_layout()
# tight_layout()自动调整subplot间的参数
plt.savefig("classifier comparison.png")
plt.show()

结果如下:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值