机器学习之鸢尾花-支持向量机

2020-05-22 00:00:00 数据 函数 参数 分类 向量

“支持向量机”(SVM)是一种有监督的机器学习算法,可用于分类任务或回归任务。但是,它主要适用于分类问题。在这个算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是你拥有的是特征的数量),每个特征的值是特定坐标的值。然后,我们通过找到很好地区分这两个类的超平面来执行分类的任务。

分隔超平面:将数据集分割开来的直线叫做分隔超平面。

超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界。

间隔:一个点到分割面的距离,称为点相对于分割面的距离。

数据集中所有的点到分割面的小间隔的2倍,称为分类器或数据集的间隔。

大间隔:SVM分类器是要找大的数据集间隔。

支持向量:坐落在数据边际的两边超平面上的点被称为支持向量。


支持向量机的优势在于:

在高位空间中非常有效

即使在数据维度比样本数量大的情况下仍然有效

在决策函数中使用训练集的子集,因此他也是高效利用内存

通用性:不同的核函数与特定的决策函数--赌赢。常见的kernel已经提供可以指定定制的内核。

支持向量机的缺点:

如果特征你数量比样本数量大的多,在选择核函数的时候要避免过拟合,正则化项是非常重要的

支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的

如下:

# “支持向量机”(SVM)是一种有监督的机器学习算法,可用于分类任务或回归任务。但是,它主要适用于分类问题。
#  在这个算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是你拥有的是特征的数量),每个特征的值是特定坐标的值。
#  然后,我们通过找到很好地区分这两个类的超平面来执行分类的任务。
# 分隔超平面:将数据集分割开来的直线叫做分隔超平面。
# 超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界。
# 间隔:一个点到分割面的距离,称为点相对于分割面的距离。
# 数据集中所有的点到分割面的小间隔的2倍,称为分类器或数据集的间隔。
# 大间隔:SVM分类器是要找大的数据集间隔。
# 支持向量:坐落在数据边际的两边超平面上的点被称为支持向量。
#
# 支持向量机的优势在于:
#   在高位空间中非常有效
#   即使在数据维度比样本数量大的情况下仍然有效
#   在决策函数中使用训练集的子集,因此他也是高效利用内存
#   通用性:不同的核函数与特定的决策函数--赌赢。常见的kernel已经提供可以指定定制的内核。
# 支持向量机的缺点:
#   如果特征你数量比样本数量大的多,在选择核函数的时候要避免过拟合,正则化项是非常重要的
#   支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的
# sklearn.svc的主要参数
# C: float参数 默认值为1.0
#         错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。
#         相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
# kernel: str参数 默认为'rbf'
#         算法中采用的核函数类型,可选参数有:
#         'linear':线性核函数
#         'poly':多项式核函数
#         'rbf':径像核函数/高斯核
#         'sigmod':sigmod核函数
#         'precomputed':核矩阵
#         gamma: float参数 默认为auto
# 核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效。
# coef0: float参数 默认为0.0
#         核函数中的独立项,只有对‘poly’和‘sigmod’核函数有用,是指其中的参数c
# probability:bool参数 默认为False
#         是否启用概率估计。 这必须在调用fit()之前启用,并且会fit()方法速度变慢。
# shrinking:bool参数 默认为True
#         是否采用启发式收缩方式
# tol: float参数 默认为1e^-3
#         svm停止训练的误差精度
# cache_size:float参数 默认为200
#         指定训练所需要的内存,以MB为单位,默认为200MB。
# class_weight: 字典类型或者‘balance’字符串。默认为None
#         给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.
#         如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
# verbose :bool参数 默认为False
#         是否启用详细输出。 此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。
#         一般情况都设为False,不用管它。
# max_iter :int参数 默认为-1
#         大迭代次数,如果为-1,表示不限制
# random_state:int型参数 默认为None
#         伪随机数发生器的种子,在混洗数据时用于概率估计。
# decision_function_shape : ‘ovo’, ‘ovr’
#         default=’ovr’    实现多分类的实现方式
from sklearn import svm
def test_svm(X_train, X_test, y_train, y_test,X,y):
    Cs = np.logspace(-24, num=100)
    scores_train = []
    scores_test = []
    for C in Cs:
        model = svm.SVC(C=C,gamma=0.1)
        model.fit(X_train, y_train)
        scores_train.append(accuracy_score(model.predict(X_train), y_train))
        scores_test.append(accuracy_score(model.predict(X_test), y_test))
    # 绘图
    print('训练得分={}'.format(scores_train))
    print('测试得分={}'.format(scores_test))
    fig = plt.figure(figsize=(106))
    ax = fig.add_subplot()
    ax.plot(Cs, scores_train, label='scores train')
    ax.plot(Cs, scores_test, label='scores test')
    ax.set_xlabel(r"C")
    ax.set_ylabel(r"score")
    ax.set_xscale('log')
    ax.set_title("SVM")
    ax.legend()
    plt.show()
    tuned_parameters = [{'kernel': ['linear''rbf','poly','sigmod'],
                         'decision_function_shape':['ovo','ovr'],
                         'C': [0.010.11101001000]}]
    svc = svm.SVC(gamma=0.1)

    model = GridSearchCV(svc, param_grid=tuned_parameters, n_jobs=-1, verbose=2, scoring='accuracy')
    model.fit(X_train, y_train)
    print('网格搜索-度量记录:', model.cv_results_)  # 包含每次训练的相关信息
    print('网格搜索-佳度量值:', model.best_score_)  # 获取佳度量值
    # 网格搜索-佳度量值: 0.980952380952381
    print('网格搜索-佳参数:', model.best_params_)  # 获取佳度量值时的代定参数的值。是一个字典
    # 网格搜索-佳参数: {'C': 10, 'decision_function_shape': 'ovo', 'kernel': 'rbf'}
    print('网格搜索-佳模型:', model.best_estimator_)  # 获取佳度量时的分类器模型
    # 网格搜索-佳模型:SVC(C=10, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
    #     decision_function_shape='ovo', degree=3, gamma=0.1, kernel='rbf',
    #     max_iter=-1, probability=False, random_state=None, shrinking=True,
    #     tol=0.001, verbose=False)
    svc = svm.SVC(C=10, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
                  decision_function_shape='ovo', degree=3, gamma=0.1, kernel='rbf',
                  max_iter=-1, probability=False, random_state=None, shrinking=True,
                  tol=0.001, verbose=False)
    svc.fit(X_train,y_train)
    print("Residual sum of squares:%.4f" % np.mean((model.predict(X_test) - y_test) ** 2))
    # Residual sum of squares:0.0222
    print('Score: %.4f' % model.score(X_test, y_test))
    # Score: 0.9778

    #考虑到绘图只能是2维的,所以根据调整相关特征值,使用佳参数重新训练和绘图
    X, y, X_train, y_train, X_test, y_test=X[:,:2], y,X_train[:,:2],y_train,X_test[:,:2],y_test
    svc = svm.SVC(C=10, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
                  decision_function_shape='ovo', degree=3, gamma=0.1, kernel='rbf',
                  max_iter=-1, probability=False, random_state=None, shrinking=True,
                  tol=0.001, verbose=False)
    svc.fit(X_train, y_train)
    print('Score: %.4f' % svc.score(X_test, y_test))  #Score: 0.8000
    plt.figure(figsize=(106))
    draw_model(svc, X, y,X_train,y_train,X_test,y_test, h=0.01,title='SVC report')
    plt.show()

    names = ['SVC Linear Kernel',

             'SVC Polynomial Kernel with Degree=3',
             'SVC Gaussian Kernel with $\gamma=0.5$',
             'LinearSVC ']
    classifiers = [
        svm.SVC(C=10, kernel='linear'),
        svm.SVC(C=10, kernel='poly', gamma=0.5, degree=3),
        svm.SVC(C=10, kernel='rbf', gamma=0.5),
        svm.LinearSVC(C=10, multi_class='ovr',max_iter=1000000)
    ]
    i=1
    plt.figure(figsize=(106))
    for name, clf in zip(names, classifiers):
        clf.fit(X_train, y_train)
        print('训练得分={}'.format(accuracy_score(clf.predict(X_train), y_train)))
        print('测试得分={}'.format(accuracy_score(clf.predict(X_test), y_test)))
        plt.subplot(22, i)
        i=i+1
        draw_model(clf, X, y, X_train, y_train, X_test, y_test, h=0.01, title=name)
    plt.show()

if __name__=='__main__':
    X_train,X_test,y_train,y_test,X,y=load_data(iris)
    # -----------------------逻辑回归--------------------------------
    # test_LogisticRegression(X_train,X_test,y_train,y_test)
    # test_LogisticRegression_C(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_Cpenaltyssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_Cmulti_classsolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_penaltyssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_multi_classssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_best(X_train, X_test, y_train, y_test)
    # ---------------------K近邻算法-----------------------
    #test_KNeighborsClassifier(X_train, X_test, y_train, y_test, X, y)

    # ------------------朴素贝叶斯-----------------------
    # 高斯朴素贝叶斯
    # 多项分布朴素贝叶斯
    # 伯努利朴素贝叶斯
    # test_naive_bayes(X_train, X_test, y_train, y_test, X, y)
    # ---------------------决策树-----------------------
    # test_tree(X_train, X_test, y_train, y_test, X, y)
    # -------------------SVM支撑向量机-----------------------
    test_svm(X_train, X_test, y_train, y_test, X, y)
    # -------------------降维-----------------------

    # ---------------------K Means聚类-----------------------

    # ------------------高斯混合模型聚类-----------------------





相关文章