使用sklearn實現svm--用於機械故障分類

清新的改革之風發表於2020-11-06

一、sklearn中svm的引數

clf = svm.SVC(C=1.0, kernel='linear', decision_function_shape='ovr')
  • C:懲罰引數。 預設值是1.0,C越大,相當於懲罰鬆弛變數,希望鬆弛變數接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時準確率很高,但容易過擬合,高方差,泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強,但過小容易欠擬合,高偏差。
  • kernel:‘linear’:線性核函式
    ‘poly’:多項式核函式
    ‘rbf’:徑像核函式/高斯核
    ‘sigmod’:sigmod核函式
  • decision_function_shape 用於svm的多分類,ovr為一對多
    方法
  • svc.fit(x,y)方法,用於訓練svm
  • svc.predict(X)方法,基於以上的訓練,對預測樣本T進行類別預測,因此只需要接收一個測試集T,該函式返回一個陣列表示個測試樣本的類別。
  • svc.score(y_train, predict(x_train)) 返回給定測試資料和標籤的平均精確度
  • svc.decision_function(X) 樣本X到分離超平面的距離

二、svm用於多分類問題
在這裡插入圖片描述
svm解決的是二分類問題,要想讓其應用於多分類問題可以有如下思路:
訓練時依次把某個類別的樣本歸為一類,其他剩餘的樣本歸為另一類,這樣k個類別的樣本就構造出了k個SVM。分類時將未知樣本分類為具有最大分類函式值的那類。
比如說現在有5個類別,第一次將第一類作為正例,其餘類別作為父類進行分類,這樣便把第一類分出;
第二次將第二類和剩餘3類分開,依次進行。
此法為一對多,one-versus-rest,本次例項中的decision_function_shape='ovr’就是使用的該方法

三、standardscaler
StandardScaler類是一個用來講資料進行歸一化和標準化的類。-計算訓練集的平均值和標準差,以便測試資料集使用相同的變換。
四、使用svm進行故障分類例項

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler

data = pd.read_csv('./train.csv',header=0)
label = np.array(data['label'])
train = data.iloc[:,1:-1]
train = abs(np.fft.fft(train)[:,:3001])/6000

d1 = np.array(data.iloc[1,1:-1])
n = len(d1)

yy = np.fft.fft(d1)
yy_ = yy[range(0,int(n/2))]
plt.plot(abs(yy_)/n)
plt.show()

x_train,x_test,y_train,y_test = train_test_split(train,label,random_state=1,train_size=0.7)
#train_test_split(待劃分樣本集合,待劃分樣本標籤,train_size測試集和樣本數目之比)

ss = StandardScaler()

x_train = ss.fit_transform(x_train)
x_test = ss.fit_transform(x_test)

clf = svm.SVC(C=1.0, kernel='linear', decision_function_shape='ovr')
#c為錯誤項的懲罰係數,kernel為演算法中採用的核函式型別 linear為線性核函式
#decision_function_shape 構造多分類器的方法有兩種 ovr為一對多比如說5類資料5個svm,第一次將第一類和其他4類分別作為正負樣本分離

clf.fit(x_train,y_train)

print(clf.score(x_train,y_train))
print("訓練集準確率:",accuracy_score(y_train,clf.predict(x_train)))
print("測試集準確率:",accuracy_score(y_test,clf.predict(x_test)))

相關文章