乳がんデータセットのSVMベースの分類

1.作者について

Che Chenjie、女性、西安工科大学電子情報学部、21レベルの大学院生
研究の方向性:マシンビジョンと人工知能
Eメール:[email protected]

Liu Shuaibo、男性、西安工科大学電子情報学部、2021年大学院生、Zhang Hongwei人工知能研究グループ
研究の方向性:マシンビジョンと人工知能
Eメール:[email protected]

2.SVMアルゴリズムの概要

2.1SVMアルゴリズム

サポートベクターマシン(SVM)は、バイナリ分類モデルです。SVMの目的は、これら2つのタイプのポイントを「最もよく」区別するラインを見つけることです。これにより、将来新しいポイントが存在する場合、このラインは2次元で示されている優れた分類。高次元空間では、2種類のサンプルデータを区別したいので、2種類のサンプルデータを区別するための超平面を見つける必要があります。SVMは、中小規模のデータサンプル、非線形、高次元の分類問題に適しています。
「38本の線」は、2次元空間でのSVMの視覚的解釈と見なすことができ、次の重要な情報を伝えます。
(1)直線(線形関数)です。
(2)デスクトップは次のように分割できます。それぞれあなたと私に属する2つの部分(分類機能を使用すると、それは二項分類です);
(3)それは机の真ん中に位置し、どちらの当事者にも有利ではありません(公平性の原則に焦点を当てることで保証できます)両当事者の利益が最大化されること)。
上記の3つのポイントは、SVMアルゴリズムの中心的な考え方です。
ここに画像の説明を挿入

2.2SVMアルゴリズムの理解と分析

SVMは、2つのクラスを区別し、マージンを最大化できる分割超平面を検出します。超平面がより適切に分割されている場合、サンプルの局所的な摂動はそれに与える影響が最も少なく、分類結果は最も堅牢になり、見えない例への一般化能力が最も強くなります。下の図からわかるように、H1は線形分離可能であり、H2とH3は線形分離可能です。このとき、最大間隔の原理を使用して、次の図の2種類のサンプルポイントを区別する超平面としてH3を選択します。
ここに画像の説明を挿入
下の図からわかるように、点線上の点から分割超平面までの距離は同じですが、実際にはこれらの点だけが超平面の位置を決定するため、「サポートベクター」と呼ばれます。 「サポートベクターマシン」の由来です。
ここに画像の説明を挿入
ここに画像の説明を挿入
実際、ほとんどの場合、データは線形分離可能ではなく、そのような条件を満たす超平面はまったく存在しません。非線形の場合、SVMの処理方法は、データを高次元空間にマッピングすることによってカーネル関数κ(⋅、⋅)を選択し、最終的に高次元特徴空間に最適な分離超平面を構築することです。平面を平面上に置くことに関して。本質的に良くない非線形データの分離。図に示すように、大量のデータを2次元空間に分割できないため、3次元空間にマッピングされ
ここに画像の説明を挿入
ます。カーネル関数の目的はデータを分類することです。このトピックでは、線形カーネル、多項式カーネル、 Gaussianカーネル(rbf)とsigmoidカーネル関数がテストされ、説明されています。
上記の表現を示すために動画を使用します。
ここに画像の説明を挿入

3.乳がんデータセットの概要

このプロジェクトでは、乳がんウィスコンシン(診断)データセット(ウィスコンシン乳がん(診断)データセット)を使用します。このデータセットには、合計569のサンプル、30の特徴(平均10、標準偏差10、最大値10)があり、ラベルはバイナリです。分類。次の図は、乳がんのデータセットと30の機能の詳細な説明を示しています。以下は、乳がんデータセットのバイナリラベルといくつかのスクリーンショットの特定のタイプと数です
ここに画像の説明を挿入
ここに画像の説明を挿入
。30の機能とそれに対応する説明は次のとおりです。
ここに画像の説明を挿入

4.SVMベースの乳がんデータセット分類実験

4.1必要なパッケージをインポートする

from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np

4.2乳がんデータセットのインポート

cancers = load_breast_cancer() #下载乳腺癌数据集
X = cancers.data  #获取特征值
Y = cancers.target  #获取标签

4.3出力データセット、機能、その他のデータ

print("数据集,特征",X.shape)  #查看特征形状
print(Y.shape)  #查看标签形状
#print(X)#输出特征值
#print(Y)#输出特征值
#print(cancers.DESCR)   #查看数据集描述
print('特征名称')#输出特征名称 
print(cancers.feature_names)  # 特征名
print('分类名称')#输出分类名称 
print(cancers.target_names)  # 标签类别名
# 注意返回值: 训练集train,x_train,y_train,测试集test,x_test,y_test
# x_train为训练集的特征值,y_train为训练集的目标值,x_test为测试集的特征值,y_test为测试集的目标值
# 注意,接收参数的顺序固定
# 训练集占80%,测试集占20%

x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
print('训练集的特征值和目标值:', x_train, y_train) 
#输出训练集的特征值和目标值 
    print('测试集的特征值和目标值:', x_test, y_test)
#输出测试集的特征值和目标值
#print(cancers.keys())

#可以根据自己写代码的习惯输出上述参数

ここに画像の説明を挿入

4.4乳がんデータセットの視覚化

np.unique(Y)  # 查看label都由哪些分类
plt.scatter(X[:, 0], X[:, 1], c=Y)
plt.show() #显示图像

ここに画像の説明を挿入

4.5モデリングトレーニング

#下面是四种核函数的建模训练

# 线性核
model_linear = SVC(C=1.0, kernel='linear')

# 多项式核
#degree表示使用的多项式的阶数
model_poly = SVC(C=1.0, kernel='poly', degree=3)

# 高斯核(RBF核)
#gamma是核函数的一个参数,gamma的值会影响测试精度
model_rbf = SVC(C=1.0, kernel='rbf', gamma=0.1)

# sigmoid核
gammalist=[]  #把gammalist定义为一个数组
score_test=[]  #把score_test定义为一个数组
gamma_dis=np.logspace(-100,-5,50)
#gamma_dis从10-100到10-5平均取50个点
for j in gamma_dis:
    model_sigmoid = SVC(kernel='sigmoid', gamma=j,cache_size=5000).fit(x_train, y_train)
    gammalist.append(j)
    score_test.append(model_sigmoid.score(x_test, y_test))
#找出最优gammalist值
print("分数--------------------",score_test)
print("测试最大分数, 
gammalist",max(score_test),gamma_dis[score_test.index(max(score_test))])
plt.plot(gammalist,score_test) #横轴为gammalist纵轴为score_test
plt.show()#显示图片

出力結果は次のとおりです。
ここに画像の説明を挿入
ここに画像の説明を挿入
出力データと画像から、ガンマ= 1.1513953993264481e-07の場合、テスト精度が最も高く、0.9298245614035088であることがわかります。テスト精度が最も高い場合、対応するガンマと呼びます。最適なガンマ値を評価します。

4.6出力トレーニングスコアとテストスコア

model_linear.fit(x_train, y_train)
train_score = model_linear.score(x_train, y_train)
test_score = model_linear.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
#线性核函数输出训练精度和测试精度

model_poly.fit(x_train, y_train)
train_score = model_poly.score(x_train, y_train)
test_score = model_poly.score(x_test, y_tetrain_score = model_rbf.score(x_train, y_train)
test_score = model_rbf.scorst)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
#多项式函数输出训练精度和测试精度

model_rbf.fit(x_train, y_train)
e(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
#rbf(高斯核)函数输出训练精度和测试精度

model_sigmoid.fit(x_train, y_train)
train_score = model_sigmoid.score(x_train, y_train)
test_score = model_sigmoid.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
#sigmoid函数输出训练精度和测试精度

出力は次のとおりです。
ここに画像の説明を挿入

5。結論

  1. 比較すると、線形カーネル(線形)と多項式カーネル(poly)はテスト精度が高く、ガウスカーネル(rbf)とシグモイドカーネルはテスト精度が低いため、線形カーネルと多項式カーネルを使用して得られた結果このトピックのテストは理想的です(フォローアップコードを自分で変更して、rbfカーネル関数とsigmoidカーネル関数の精度を向上させることもできます)。
  2. ガウスカーネルのテスト精度は1です。
  3. シグモイドカーネル関数では、ガンマの値がテストの精度に影響を与えます。また、
    gamma = 1.1513953993264481e-07の場合、テストの精度は最高で0.9298245614035088です。5
    。参照リンク
    乳がんデータセットは
    https://pan.baidu.com/s/1DN4AlRzDkmBSZlnk8dY15gから取得されます。抽出コード:i6u6
    ブログ参照リンク:
    https:// blog .csdn.net / qq_42363032 / article / details / 107210881

おすすめ

転載: blog.csdn.net/m0_37758063/article/details/123647182