Pythonの素人の言語サポートベクターマシン(SVM)アルゴリズム

ロジスティック回帰と比較して、多くの場合、SVMアルゴリズムは、より良好な精度が得られるデータを算出することができます。従来の2クラスSVMは、操作にのみ適用されるが、それはSVM分類がマルチタスクに適用することができそうという、核技術(カーネル)を介して行うことができます。

この記事では原則とコアスキルは、それが最終的にアクセス可能として、各種パラメータやデモsklearn SVM戦闘のコンテンツの役割を紹介します正確にどのようにSVMを説明します。式導出側面については、この地域についてのオンライン記事があまりにも、ここで起動されません -

1.SVMプロフィール

N次元平面のできるサポートベクターマシン、超平面を見つける最も明白には、データを分類しました!次の図の描写を参照してください。

上図のように、二次元平面上に、赤と青点の2種類があります。点これらの2つのタイプを分類するために、あなただけの緑線の図の複数のように、様々な分類方法を有することができ、データは二つの部分に分けることができます。

しかし、SVMんが、データを分類するために、最善その行(二次元空間)、または超平面(高次元の空間)を見つけることです。最高の標準は、最大距離です

、最大間隔を検索する最大距離を見つけるために、簡単なについてここで何かを言って、データの2つのカテゴリの方法として、超平面の距離と呼ばれる間隔をそして、それを行うには、最大間隔を見つけることです。

これは、最終的に間隔を最大化する最適化問題となります。

2.SVM核スキル

核の技術は、主ケースと特定の線形SVM分類不可能の場合であることができないSVM多区分線形解決します。

以下のようなこのようなデータ:

原子力技術データ

私たちは、このようなデータの外観を変換するために、カーネル関数を使用することができます。この時間は、我々は手動で私たちは、新たなデータを取得することを、この新しいポイントを、すべてのデータは、ユークリッド距離が計算され、新しいポイントを定義し、 。これは、過去からのこの新しいデータポイントから、それはクラスに分類され、または別のクラスであるました。これはカーネル関数です。

ガウシアンカーネル

これは、最も表面で比較的簡単に導入されます。上記の説明を通じて、それはそれとシグモイドのようなビットではないでしょうか?データは変換機能によって使用され、最終的な結果を得るされ、実際には、ああ、シグモイドカーネル関数は鐘があり、それをし、そしてその方法は、上記の、それはガウス核であると述べました。

ここではいくつかのポイントを追加します。

  • 1.上面的图中只有一个点,实际可以有无限多个点,这就是为什么说SVM可以将数据映射到多维空间中。计算一个点的距离就是1维,2个点就是二维,3个点就是三维等等。。。
  • 2.上面例子中的红点是直接手动指定,实际情况中可没办法这样,通常是用随机产生,再慢慢试出最好的点。
  • 3.上面举例这种情况属于高斯核函数,而实际常见的核函数还有多项式核函数,Sigmoid核函数等等。

OK,以上就是关于核技巧(核函数)的初步介绍,更高级的这里也不展开了,网上的教程已经非常多了。

接下来我们继续介绍sklearn中SVM的应用方面内容。

3.sklearn中SVM的参数

def SVC(C=1.0, 
             kernel='rbf', 
             degree=3, 
             gamma='auto_deprecated',
             coef0=0.0, 
             shrinking=True, 
             probability=False,
             tol=1e-3, 
             cache_size=200, 
             class_weight=None,
             verbose=False, 
             max_iter=-1, 
             decision_function_shape='ovr',
             random_state=None)
 
- C:类似于Logistic regression中的正则化系数,必须为正的浮点数,默认为 1.0,这个值越小,说明正则化效果越强。换句话说,这个值越小,越训练的模型更泛化,但也更容易欠拟合。
- kernel:核函数选择,比较复杂,稍后介绍
- degree:多项式阶数,仅在核函数选择多项式(即“poly”)的时候才生效,int类型,默认为3。
- gamma:核函数系数,仅在核函数为高斯核,多项式核,Sigmoid核(即“rbf“,“poly“ ,“sigmoid“)时生效。float类型,默认为“auto”(即值为 1 / n_features)。
- coef0:核函数的独立项,仅在核函数为多项式核核Sigmoid核(即“poly“ ,“sigmoid“)时生效。float类型,默认为0.0。独立项就是常数项。
- shrinking:不断缩小的启发式方法可以加快优化速度。 就像在FAQ中说的那样,它们有时会有所帮助,有时却没有帮助。 我认为这是运行时问题,而不是收敛问题。
- probability:是否使用概率评估,布尔类型,默认为False。开启的话会评估数据到每个分类的概率,不过这个会使用到较多的计算资源,慎用!!
- tol:停止迭代求解的阈值,单精度类型,默认为1e-3。逻辑回归也有这样的一个参数,功能都是一样的。
- cache_size:指定使用多少内存来运行,浮点型,默认200,单位是MB。
- class_weight:分类权重,也是和逻辑回归的一样,我直接就搬当时的内容了:分类权重,可以是一个dict(字典类型),也可以是一个字符串"balanced"字符串。默认是None,也就是不做任何处理,而"balanced"则会去自动计算权重,分类越多的类,权重越低,反之权重越高。也可以自己输出一个字典,比如一个 0/1 的二元分类,可以传入{0:0.1,1:0.9},这样 0 这个分类的权重是0.1,1这个分类的权重是0.9。这样的目的是因为有些分类问题,样本极端不平衡,比如网络攻击,大部分正常流量,小部分攻击流量,但攻击流量非常重要,需要有效识别,这时候就可以设置权重这个参数。
- verbose:输出详细过程,int类型,默认为0(不输出)。当大于等于1时,输出训练的详细过程。仅当"solvers"参数设置为"liblinear"和"lbfgs"时有效。
- max_iter:最大迭代次数,int类型,默认-1(即无限制)。注意前面也有一个tol迭代限制,但这个max_iter的优先级是比它高的,也就如果限制了这个参数,那是不会去管tol这个参数的。
- decision_function_shape:多分类的方案选择,有“ovo”,“ovr”两种方案,也可以选则“None”,默认是“ovr”,详细区别见下面。
- random_state:随时数种子。

sklearn-SVM参数,kernel特征选择

kernel:核函数选择,字符串类型,可选的有“linear”,“poly”,“rbf”,“sigmoid”,“precomputed”以及自定义的核函数,默认选择是“rbf”。各个核函数介绍如下:
“linear”:线性核函数,最基础的核函数,计算速度较快,但无法将数据从低维度演化到高维度
“poly”:多项式核函数,依靠提升维度使得原本线性不可分的数据变得线性可分
“rbf”:高斯核函数,这个可以映射到无限维度,缺点是计算量比较大
“sigmoid”:Sigmoid核函数,对,就是逻辑回归里面的那个Sigmoid函数,使用Sigmoid的话,其实就类似使用一个一层的神经网络
“precomputed”:提供已经计算好的核函数矩阵,sklearn不会再去计算,这个应该不常用
“自定义核函数”:sklearn会使用提供的核函数来进行计算
说这么多,那么给个不大严谨的推荐吧
样本多,特征多,二分类,选择线性核函数
样本多,特征多,多分类,多项式核函数
样本不多,特征多,二分类/多分类,高斯核函数
样本不多,特征不多,二分类/多分类,高斯核函数

当然,正常情况下,一般都是用交叉验证来选择特征,上面所说只是一个较为粗浅的推荐。

sklearn-SVM参数,多分类方案

其实这个在逻辑回归里面已经有说过了,这里还是多说一下。

原始的SVM是基于二分类的,但有些需求肯定是需要多分类。那么有没有办法让SVM实现多分类呢?那肯定是有的,还不止一种。

实际上二元分类问题很容易推广到多元逻辑回归。比如总是认为某种类型为正值,其余为0值

あなたは、マルチ分類の問題を解決するために、2つのクラスのメソッドを使用することができますので、例えば、A、B、Cのカテゴリに分類されるように、それは、に対処するための負のデータとしてデータA、BおよびCとして前方に置くことができますこの方法は、最も一般的に使用される1-VS-休みで、OVRを言及しました。しかし、この方法も簡単に(もちろん、他のアルゴリズムは、より良いマルチ分類を有していてもよい)他の二つの分類モデルを取得するために拡張することができます。

別の分類スキームが(MVM)多多対多であり 、 それは、試料中のサンプルの別の部分を選択し、分類のカテゴリのカテゴリは、二つを行います

それは信じられないほどに聞こえるが、実際には実際に行うことができます。そのようなデータはA、B、C三つのカテゴリーを有しています。

我々は、A、負のデータ点は、モデルを訓練するように、順方向データ、CとしてBあろう。順方向データとしてA、C、負としてBデータは、分類モデルをトレーニングします。最後に、B、正データとしてC、C負のデータ、モデル列車など。

これらの三つのモデルを通じて、マルチ分類を達成することができます、そしてもちろんここでの一例であり、実際の使用は、MVMのより良い方法があります。スペースがここに限定されているとして開始されていません。

最も一般的に使用されるMVMワン対ワン(OVO)です。OVO MVMは特殊なケースです。すなわち、二つのサンプルそれぞれの選択は、バイナリロジスティック回帰を行います。

両方の複数の分類方法を比較、通常、OVRは、モデルの精度で、比較的速い速度が比較的簡単であるが、それほど高くないMVM。MVMはちょうど反対、高精度、しかし、しかし速度よりもOVRです。

4.sklearn SVM戦闘

我々はまだ、虹彩データセットを使用していますが、今回は分類する花の二種類の一つだけを使用して。まず、データを準備します。

import matplotlib.pyplot as plt
import numpy as np
from sklearn import svm,datasets
import pandas as pd
tem_X = iris.data[:, :2]
tem_Y = iris.target
new_data = pd.DataFrame(np.column_stack([tem_X,tem_Y]))
#过滤掉其中一种类型的花
new_data = new_data[new_data[2] != 1.0]
#生成X和Y
X = new_data[[0,1]].values
Y = new_data[[2]].values

そして、トレーニングデータは、最終的なグラフィックスを生成します


# 拟合一个SVM模型
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)

# 获取分割超平面
w = clf.coef_[0]
# 斜率
a = -w[0] / w[1]
# 从-5到5,顺序间隔采样50个样本,默认是num=50
# xx = np.linspace(-5, 5)  # , num=50)
xx = np.linspace(-2, 10)  # , num=50)
# 二维的直线方程
yy = a * xx - (clf.intercept_[0]) / w[1]
print("yy=", yy)

# plot the parallels to the separating hyperplane that pass through the support vectors
# 通过支持向量绘制分割超平面
print("support_vectors_=", clf.support_vectors_)
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])

# plot the line, the points, and the nearest vectors to the plane
plt.plot(xx, yy, 'k-')
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')

plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=80, facecolors='none')


plt.scatter(X[:, 0].flat, X[:, 1].flat, c='#86c6ec', cmap=plt.cm.Paired)
# import operator
# from functools import reduce
# plt.scatter(X[:, 0].flat, X[:, 1].flat, c=reduce(operator.add, Y), cmap=plt.cm.Paired)

plt.axis('tight')
plt.show()

次のように、最終的なSVM分類結果は以下のとおりです。
アイリスの分類結果

上記〜

おすすめ

転載: www.cnblogs.com/listenfwind/p/11919487.html