SVM 是有監(jiān)督的學(xué)習(xí)模型,我們需要事先對(duì)數(shù)據(jù)打上分類標(biāo)簽,通過求解最大分類間隔來求解二分類問題。如果要求解多分類問題,可以將多個(gè)二分類器組合起來形成一個(gè)多分類器。
1 基本介紹
SVM 既可以做回歸,也可以做分類器。
當(dāng)用 SVM 做回歸的時(shí)候,我們可以使用 SVR 或?LinearSVR。SVR 的英文是 Support?Vector Regression。
當(dāng)做分類器的時(shí)候,我們使用的是 SVC 或者LinearSVC。SVC 的英文是 Support?Vector Classification。
LinearSVC 是個(gè)線性分類器,用于處理線性可分的數(shù)據(jù),只能使用線性核函數(shù)。
如果是針對(duì)非線性的數(shù)據(jù),需要用到 SVC。在 SVC 中,我們既可以使用到線性核函數(shù)(進(jìn)行線性劃分),也能使用高維的核函數(shù)(進(jìn)行非線性劃分)。
2 如何創(chuàng)建一個(gè) SVM 分類器呢?
使用 SVC 的構(gòu)造函數(shù):model = svm.SVC(kernel=‘rbf’, C=1.0, gamma=‘‘a(chǎn)uto’),這里有三個(gè)重要的參數(shù)kernel、C 和 gamma。
(1) kernel 代表核函數(shù)的選擇,它有四種選擇,只不過默認(rèn)是 rbf,即高斯核函數(shù)。
A. linear:線性核函數(shù)?
B. poly:多項(xiàng)式核函數(shù)
C. rbf:高斯核函數(shù)(默認(rèn))?
D. sigmoid:sigmoid 核函數(shù)
線性核函數(shù),是在數(shù)據(jù)線性可分的情況下使用的,運(yùn)算速度快,效果好。不足在于它不能處理線性不可分的數(shù)據(jù)。
多項(xiàng)式核函數(shù)可以將數(shù)據(jù)從低維空間映射到高維空間,但參數(shù)比較多,計(jì)算量大。
高斯核函數(shù)同樣可以將樣本映射到高維空間,但相比于多項(xiàng)式核函數(shù)來說所需的參數(shù)比較少,通常性能不錯(cuò),所以是默認(rèn)使用的核函數(shù)。
sigmoid 經(jīng)常用在神經(jīng)網(wǎng)絡(luò)的映射中。因此當(dāng)選用 sigmoid 核函數(shù)時(shí),SVM 實(shí)現(xiàn)的是多層神經(jīng)網(wǎng)絡(luò)。
(2) 參數(shù) C 代表目標(biāo)函數(shù)的懲罰系數(shù),懲罰系數(shù)指的是分錯(cuò)樣本時(shí)的懲罰程度,默認(rèn)情況下為 1.0。當(dāng) C 越大的時(shí)候,分類器的準(zhǔn)確性越高,但同樣容錯(cuò)率會(huì)越低,泛化能力會(huì)變差。相反,C 越小,泛化能力越強(qiáng),但是準(zhǔn)確性會(huì)降低。
(3)?參數(shù) gamma 代表核函數(shù)的系數(shù),默認(rèn)為樣本特征數(shù)的倒數(shù),即 gamma = 1 / n_features。
3 代碼實(shí)現(xiàn)
# 加載數(shù)據(jù)集,你需要把數(shù)據(jù)放到目錄中
data = pd.read_csv("./../data/svm/data.csv")
# 數(shù)據(jù)探索
# 因?yàn)閿?shù)據(jù)集中列比較多,我們需要把 dataframe 中的列全部顯示出來
pd.set_option('display.max_columns', None)
#print(data.columns)
#print(data.head(5))
#print(data.describe())
# 將特征字段分成 3 組
features_mean =list(data.columns[2:12])
features_se =list(data.columns[12:22])
features_worst =list(data.columns[22:32])
# 數(shù)據(jù)清洗
# ID 列沒有用,刪除該列
data.drop("id", axis=1, inplace=True)
# 將 B 良性替換為 0,M 惡性替換為 1
data['diagnosis'] = data['diagnosis'].map({'M':1, 'B':0})
#print(data.head(5))
# 將腫瘤診斷結(jié)果可視化
sns.countplot(data['diagnosis'], label="Count")
plt.show()
# 用熱力圖呈現(xiàn) features_mean 字段之間的相關(guān)性
corr = data[features_mean].corr()
plt.figure(figsize=(14, 14))
# annot=True 顯示每個(gè)方格的數(shù)據(jù)
sns.heatmap(corr, annot=True)
plt.show()
# 特征選擇
features_remain = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']
# 抽取 30% 的數(shù)據(jù)作為測(cè)試集,其余作為訓(xùn)練集
train, test = train_test_split(data, test_size=0.3)# in this our main data is splitted into train and test
# 抽取特征選擇的數(shù)值作為訓(xùn)練和測(cè)試數(shù)據(jù)
train_X = train[features_remain]
train_y = train['diagnosis']
test_X = test[features_remain]
test_y = test['diagnosis']
# 采用 Z-Score 規(guī)范化數(shù)據(jù),保證每個(gè)特征維度的數(shù)據(jù)均值為 0,方差為 1
ss = StandardScaler()
train_X = ss.fit_transform(train_X)
test_X = ss.transform(test_X)
# 創(chuàng)建 SVM 分類器
#model = svm.SVC()
#model = svm.SVC(kernel="linear")
model = svm.LinearSVC()
# 用訓(xùn)練集做訓(xùn)練
model.fit(train_X, train_y)
# 用測(cè)試集做預(yù)測(cè)
prediction = model.predict(test_X)
print('準(zhǔn)確率: ', metrics.accuracy_score(prediction,test_y))