2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tukivektorikone (SVM) on tehokas ja monipuolinen koneoppimismalli, joka sopii lineaariseen ja epälineaariseen luokitteluun, regressioon ja poikkeamien havaitsemiseen. Tässä artikkelissa esitellään tukivektorikonealgoritmi ja sen toteutus scikit-learnissä sekä tarkastellaan lyhyesti pääkomponenttianalyysiä ja sen käyttöä scikit-learnissä.
Tukivektorikone (SVM) on koneoppimisen alalla laajalti käytetty algoritmi, jota suositaan sen ominaisuuden vuoksi, että se tarjoaa merkittävän tarkkuuden pienemmillä laskentaresursseilla. SVM:ää voidaan käyttää sekä luokitus- että regressiotehtäviin, mutta yleisimmin sitä käytetään luokitusongelmissa.
Tukivektorikoneiden tavoitteena on NNN mittatila ( NNN on ominaisuuksien lukumäärä) löytääksesi hypertason, joka erottaa datapisteet selvästi. Tämä hypertaso mahdollistaa eri luokkien datapisteiden erottamisen ja mahdollisimman kauas hypertasosta luokituksen kestävyyden varmistamiseksi.
Tietopisteiden tehokkaan erottamisen saavuttamiseksi voi olla useita hypertasoja. Tavoitteenamme on valita hypertaso, jolla on maksimimarginaali, eli maksimietäisyys kahden luokan välillä. Marginaalien maksimointi parantaa luokittelun tarkkuutta.
Hypertaso on päätösraja, joka jakaa datapisteet. Hypertason molemmilla puolilla sijaitsevat datapisteet voidaan luokitella eri luokkiin. Hypertason mitat riippuvat piirteiden lukumäärästä: jos syöteominaisuuksia on 2, hypertaso on suora, jos piirteitä on 3, hypertaso on kaksiulotteinen taso. Kun piirteiden määrä ylittää 3, hypertasoa on vaikea ymmärtää intuitiivisesti.
Tukivektorit viittaavat hypertasoa lähinnä oleviin pisteisiin, jotka vaikuttavat hypertason sijaintiin ja suuntaan. Näillä tukivektoreilla voimme maksimoida luokittelijan marginaalin. Tukivektorien poistaminen muuttaa hypertason sijaintia, joten ne ovat tärkeitä SVM:n rakentamisessa.
Logistisessa regressiossa käytämme sigmoidifunktiota tiivistämään lineaarifunktion lähtöarvo alueelle [0,1] ja määrittämään tunnisteet kynnyksen (0,5) perusteella. SVM:ssä käytetään lineaarifunktion lähtöarvoa luokituksen päättämiseen: jos tulos on suurempi kuin 1, se kuuluu yhteen luokkaan, jos lähtö on -1, se kuuluu toiseen luokkaan. SVM muodostaa marginaalialueen [-1,1] asettamalla lähtöarvon kynnysarvoksi 1 ja -1.
Hyvä- ja pahanlaatuisten syöpien diagnoosien ennustaminen tukivektorikoneilla.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set_style('whitegrid')
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
# 创建 DataFrame
col_names = list(cancer.feature_names)
col_names.append('target')
df = pd.DataFrame(np.c_[cancer.data, cancer.target], columns=col_names)
df.head()
df.info()print(cancer.target_names)
# ['malignant', 'benign']
# 数据描述:
df.describe()
# 统计摘要:
df.info()
sns.pairplot(df, hue='target', vars=[
'mean radius', 'mean texture', 'mean perimeter', 'mean area',
'mean smoothness', 'mean compactness', 'mean concavity',
'mean concave points', 'mean symmetry', 'mean fractal dimension'
])
sns.countplot(x=df['target'], label="Count")
plt.figure(figsize=(10, 8))
sns.scatterplot(x='mean area', y='mean smoothness', hue='target', data=df)
plt.figure(figsize=(20,10))
sns.heatmap(df.corr(), annot=True)
Koneoppimisessa mallikoulutus on kriittinen askel ratkaisujen löytämisessä ongelmiin.Alla esittelemme kuinka sitä käytetäänscikit-learn
Suorita mallikoulutusta ja esittele tukivektorikoneen (SVM) suorituskykyä eri ytimissä.
Ensin meidän on valmisteltava ja esikäsiteltävä tiedot. Seuraava on koodiesimerkki tietojen esikäsittelyä varten:
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, MinMaxScaler
X = df.drop('target', axis=1)
y = df.target
print(f"'X' shape: {X.shape}")
print(f"'y' shape: {y.shape}")
# 'X' shape: (569, 30)
# 'y' shape: (569,)
pipeline = Pipeline([
('min_max_scaler', MinMaxScaler()),
('std_scaler', StandardScaler())
])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
Käyttämässämme koodissa MinMaxScaler
jaStandardScaler
Skaalaa tiedot. Tiedot on jaettu harjoitus- ja testisarjoihin, joista 30 % käytetään testaukseen.
Mallin suorituskyvyn arvioimiseksi määrittelemme a print_score
toiminto, joka voi tulostaa koulutus- ja testitulosten tarkkuuden, luokitteluraportin ja sekavuusmatriisin:
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import pandas as pd
def print_score(clf, X_train, y_train, X_test, y_test, train=True):
if train:
pred = clf.predict(X_train)
clf_report = pd.DataFrame(classification_report(y_train, pred, output_dict=True))
print("Train Result:n================================================")
print(f"Accuracy Score: {accuracy_score(y_train, pred) * 100:.2f}%")
print("_______________________________________________")
print(f"CLASSIFICATION REPORT:n{clf_report}")
print("_______________________________________________")
print(f"Confusion Matrix: n {confusion_matrix(y_train, pred)}n")
else:
pred = clf.predict(X_test)
clf_report = pd.DataFrame(classification_report(y_test, pred, output_dict=True))
print("Test Result:n================================================")
print(f"Accuracy Score: {accuracy_score(y_test, pred) * 100:.2f}%")
print("_______________________________________________")
print(f"CLASSIFICATION REPORT:n{clf_report}")
print("_______________________________________________")
print(f"Confusion Matrix: n {confusion_matrix(y_test, pred)}n")
Tukivektorikone (SVM) on tehokas luokitusalgoritmi, jonka suorituskykyyn vaikuttavat hyperparametrit. Seuraavassa esitellään SVM:n pääparametrit ja niiden vaikutus mallin suorituskykyyn:
'poly'
), muut ytimet jättävät huomioimatta. Optimaaliset hyperparametriarvot löytyvät ruudukkohaulla.Lineaarinen ytimen SVM sopii useimpiin tilanteisiin, varsinkin kun tietojoukossa on paljon ominaisuuksia. Seuraavassa on esimerkki koodista, jossa käytetään lineaarisen ytimen SVM:ää:
from sklearn.svm import LinearSVC
model = LinearSVC(loss='hinge', dual=True)
model.fit(X_train, y_train)
print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
Koulutus- ja testitulokset ovat seuraavat:
Treenitulokset:
Accuracy Score: 86.18%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 1.000000 0.819079 0.861809 0.909539 0.886811
recall 0.630872 1.000000 0.861809 0.815436 0.861809
f1-score 0.773663 0.900542 0.861809 0.837103 0.853042
support 149.000000 249.000000 0.861809 398.000000 398.000000
_______________________________________________
Confusion Matrix:
[[ 94 55]
[ 0 249]]
Testitulokset:
Accuracy Score: 89.47%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 1.000000 0.857143 0.894737 0.928571 0.909774
recall 0.714286 1.000000 0.894737 0.857143 0.894737
f1-score 0.833333 0.923077 0.894737 0.878205 0.890013
support 63.000000 108.000000 0.894737 171.000000 171.000000
_______________________________________________
Confusion Matrix:
[[ 45 18]
[ 0 108]]
Polynomiytimen SVM sopii epälineaariselle datalle. Seuraavassa on esimerkki koodista, jossa käytetään toisen asteen polynomiydintä:
from sklearn.svm import SVC
model = SVC(kernel='poly', degree=2, gamma='auto', coef0=1, C=5)
model.fit(X_train, y_train)
print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
Koulutus- ja testitulokset ovat seuraavat:
Treenitulokset:
Accuracy Score: 96.98%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.985816 0.961089 0.969849 0.973453 0.970346
recall 0.932886 0.991968 0.969849 0.962427 0.969849
f1-score 0.958621 0.976285 0.969849 0.967453 0.969672
support 149.000000 249.000000 0.969849 398.000000 398.000000
_______________________________________________
Confusion Matrix:
[[139 10]
[ 2 247]]
Testitulokset:
Accuracy Score: 97.08%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.967742 0.972477 0.97076 0.970109 0.970733
recall 0.952381 0.981481 0.97076 0.966931 0.970760
f1-score 0.960000 0.976959 0.97076 0.968479 0.970711
support 63.000000 108.000000 0.97076 171.000000 171.000000
_______________________________________________
Confusion Matrix:
[[ 60 3]
[ 2 106]]
Radial Base Function (RBF) -ytimet soveltuvat epälineaarisen datan käsittelyyn. Seuraavassa on esimerkki koodista, jossa käytetään RBF-ydintä:
model = SVC(kernel='rbf', gamma=0.5, C=0.1)
model.fit(X_train, y_train)
print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
Koulutus- ja testitulokset ovat seuraavat:
Treenitulokset:
Accuracy Score: 62.56%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.0 0.625628 0.625628 0.312814 0.392314
recall 0.0 1.000000 0.625628 0.500000 0.625628
f1-score 0.0 0.769231 0.625628 0.384615 0.615385
support 149.0 249.0 0.625628 398.0 398.0
_______________________________________________
Confusion Matrix:
[[ 0 149]
[ 0 249]]
Testitulokset:
Accuracy Score: 64.97%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.0 0.655172 0.649661 0.327586 0.409551
recall 0.0 1.000000 0.649661 0.500000 0.649661
f1-score 0.0 0.792453 0.649661 0.396226 0.628252
support 63.0 108.0 0.649661 171.0 171.0
_______________________________________________
Confusion Matrix:
[[ 0 63]
[ 0 108]]
Yllä olevan mallin koulutus- ja arviointiprosessin avulla voimme havaita eri SVM-ytimien suorituskykyerot. Lineaarisen ytimen SVM toimii hyvin tarkkuuden ja harjoitusajan suhteen, ja se sopii tilanteisiin, joissa datamitat ovat korkeammat. Polynomiytimen SVM ja RBF-ytimen SVM toimivat paremmin epälineaarisissa tiedoissa, mutta ne voivat johtaa ylisovitukseen tietyissä parametriasetuksissa. Sopivien ytimien ja hyperparametrien valitseminen on ratkaisevan tärkeää mallin suorituskyvyn parantamiseksi.
digitaalinen tulo : SVM olettaa, että syötetiedot ovat numeerisia. Jos syötetiedot ovat kategoriallisia muuttujia, saatat joutua muuttamaan ne binäärimuuttujiksi (yksi muuttuja luokkaa kohden).
binääriluokitus :Basic SVM sopii binääriluokitteluongelmiin. Vaikka SVM:ää käytetään pääasiassa binääriluokitukseen, on olemassa myös laajennettuja versioita regressiolle ja moniluokkaluokittelulle.
X_train = pipeline.fit_transform(X_train)
X_test = pipeline.transform(X_test)
Seuraavassa näkyy eri SVM-ytimien koulutus- ja testaustulokset:
Lineaarinen ydin SVM
print("=======================Linear Kernel SVM==========================")
model = SVC(kernel='linear')
model.fit(X_train, y_train)
print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
Treenitulokset:
Accuracy Score: 98.99%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 1.000000 0.984190 0.98995 0.992095 0.990109
recall 0.973154 1.000000 0.98995 0.986577 0.989950
f1-score 0.986395 0.992032 0.98995 0.989213 0.989921
support 149.000000 249.000000 0.98995 398.000000 398.000000
_______________________________________________
Confusion Matrix:
[[145 4]
[ 0 249]]
测试结果
Accuracy Score: 97.66%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.968254 0.981481 0.976608 0.974868 0.976608
recall 0.968254 0.981481 0.976608 0.974868 0.976608
f1-score 0.968254 0.981481 0.976608 0.974868 0.976608
support 63.000000 108.000000 0.976608 171.000000 171.000000
_______________________________________________
Confusion Matrix:
[[ 61 2]
[ 2 106]]
print("=======================Polynomial Kernel SVM==========================")
from sklearn.svm import SVC
model = SVC(kernel='poly', degree=2, gamma='auto')
model.fit(X_train, y_train)
print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
Treenitulokset:
Accuracy Score: 85.18%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.978723 0.812500 0.851759 0.895612 0.874729
recall 0.617450 0.991968 0.851759 0.804709 0.851759
f1-score 0.757202 0.893309 0.851759 0.825255 0.842354
support 149.000000 249.000000 0.851759 398.000000 398.000000
_______________________________________________
Confusion Matrix:
[[ 92 57]
[ 2 247]]
测试结果:
Accuracy Score: 82.46%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.923077 0.795455 0.824561 0.859266 0.842473
recall 0.571429 0.972222 0.824561 0.771825 0.824561
f1-score 0.705882 0.875000 0.824561 0.790441 0.812693
support 63.000000 108.000000 0.824561 171.000000 171.000000
_______________________________________________
Confusion Matrix:
[[ 36 27]
[ 3 105]]
print("=======================Radial Kernel SVM==========================")
from sklearn.svm import SVC
model = SVC(kernel='rbf', gamma=1)
model.fit(X_train, y_train)
print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
Treenitulokset:
Accuracy Score: 100.00%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 1.0 1.0 1.0 1.0 1.0
recall 1.0 1.0 1.0 1.0 1.0
f1-score 1.0 1.0 1.0 1.0 1.0
support 149.0 249.0 1.0 398.0 398.0
_______________________________________________
Confusion Matrix:
[[149 0]
[ 0 249]]
测试结果:
Accuracy Score: 63.74%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 1.000000 0.635294 0.637427 0.817647 0.769659
recall 0.015873 1.000000 0.637427 0.507937 0.637427
f1-score 0.031250 0.776978 0.637427 0.404114 0.502236
support 63.000000 108.000000 0.637427 171.000000 171.000000
_______________________________________________
Confusion Matrix:
[[ 1 62]
[ 0 108]]
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100],
'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001],
'kernel': ['rbf', 'poly', 'linear']}
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)
best_params = grid.best_params_
print(f"Best params: {best_params}")
svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=True)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=False)
Treenitulokset:
Accuracy Score: 98.24%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.986301 0.980159 0.982412 0.983230 0.982458
recall 0.966443 0.991968 0.982412 0.979205 0.982412
f1-score 0.976271 0.986028 0.982412 0.981150 0.982375
support 149.000000 249.000000 0.982412 398.000000 398.000000
_______________________________________________
Confusion Matrix:
[[144 5]
[ 2 247]]
测试结果:
Accuracy Score: 98.25%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.983871 0.981651 0.982456 0.982761 0.982469
recall 0.968254 0.990741 0.982456 0.979497 0.982456
f1-score 0.976000 0.986175 0.982456 0.981088 0.982426
support 63.000000 108.000000 0.982456 171.000000 171.000000
_______________________________________________
Confusion Matrix:
[[ 61 2]
[ 1 107]]
Pääkomponenttianalyysi (PCA) on tekniikka, jolla saavutetaan lineaarisen ulottuvuuden vähentäminen projisoimalla tiedot alemman ulottuvuuden tilaan.
Koska korkeadimensionaalista dataa on vaikea visualisoida suoraan, voimme käyttää PCA:ta löytääksemme kaksi ensimmäistä pääkomponenttia ja visualisoidaksemme tiedot kaksiulotteisessa avaruudessa. Tämän saavuttamiseksi tiedot on ensin normalisoitava siten, että kunkin ominaisuuden varianssi on yksikkövarianssi.
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 数据标准化
scaler = StandardScaler()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# PCA 降维
pca = PCA(n_components=2)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)
# 可视化前两个主成分
plt.figure(figsize=(8,6))
plt.scatter(X_train[:,0], X_train[:,1], c=y_train, cmap='plasma')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()
Kahden ensimmäisen pääkomponentin avulla voimme helposti erottaa eri tietopisteluokat kaksiulotteisessa avaruudessa.
Vaikka ulottuvuuden vähentäminen on voimakasta, komponenttien merkitystä on vaikea ymmärtää suoraan. Jokainen komponentti vastaa alkuperäisten ominaisuuksien yhdistelmää, joka voidaan saada sovittamalla PCA-objekti.
Komponentteihin liittyviä ominaisuuksia ovat:
Kun käytämme tukivektorikoneita (SVM) mallikoulutukseen, meidän on säädettävä hyperparametreja parhaan mallin saamiseksi. Seuraava on esimerkkikoodi SVM-parametrien säätämiseen ruudukkohaun (GridSearchCV) avulla:
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100],
'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001],
'kernel': ['rbf', 'poly', 'linear']}
# 网格搜索
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)
best_params = grid.best_params_
print(f"Best params: {best_params}")
# 使用最佳参数训练模型
svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
Treenitulokset:
Accuracy Score: 96.48%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.978723 0.957198 0.964824 0.967961 0.965257
recall 0.926174 0.987952 0.964824 0.957063 0.964824
f1-score 0.951724 0.972332 0.964824 0.962028 0.964617
support 149.000000 249.000000 0.964824 398.000000 398.000000
_______________________________________________
Confusion Matrix:
[[138 11]
[ 3 246]]
测试结果:
Accuracy Score: 96.49%
_______________________________________________
CLASSIFICATION REPORT:
0.0 1.0 accuracy macro avg weighted avg
precision 0.967213 0.963636 0.964912 0.965425 0.964954
recall 0.936508 0.981481 0.964912 0.958995 0.964912
f1-score 0.951613 0.972477 0.964912 0.962045 0.964790
support 63.000000 108.000000 0.964912 171.000000 171.000000
_______________________________________________
Confusion Matrix:
[[ 59 4]
[ 2 106]]
Tässä artikkelissa opimme seuraavaa:
viitata:Tuki Vector Machine & PCA Tutorial aloittelijoille
Suosittele aiheeseen liittyviä sarakkeitani: