簡體   English   中英

我試圖用自定義RBF內核實現scikit-learn中的SVM,但它顯示錯誤,該怎么辦?

[英]I am trying to implement SVM in scikit-learn with custom RBF kernel ,But it is showing an error ,what to do?

import pandas as pd
import numpy as np
from sklearn import preprocessing, svm
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import math
import numpy.linalg as la

df = pd.read_csv("DataWithoutHeader162.csv")
df.columns = ['Temperature','Humidity','Windspeed','Traffic','PM 2.5']
#print(df.head())

forecast_col = 'PM 2.5'
df['label'] = df[forecast_col].shift(1)
df.fillna(value=-99999, inplace=True)

X = np.array(df.drop(['label','PM 2.5'] , 1))
X = preprocessing.scale(X)
df.dropna(inplace = True)

y = np.array(df['label'])
df.dropna(inplace = True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.05) 


#kernel definition
def radial_basis(gamma=10):
    return lambda x, y: np.exp(-gamma*la.norm(np.subtract(x, y)))

#SupportVectorMachine with radial_basis Kernel
clf_SVM_radial_basis = SVC(kernel = radial_basis())
clf_SVM_radial_basis.fit(X_train,y_train)
confidence3 = clf_SVM_radial_basis.score(X_test,y_test)
print("Confidence of SVM with radial_basis Kernel = ",(confidence3*100),"%")

此代碼顯示錯誤:

Traceback (most recent call last):  
File "F:\MachineLearningPyCodes\SvmOnDelhiAqiDataPrbf.py", line 68, in  
module  
clf_SVM_radial_basis.fit(X_train,y_train)  
File "C:\Python35\lib\site-packages\sklearn\svm\base.py", line 189, in fit  
fit(X, y, sample_weight, solver_type, kernel, random_seed=seed)  
File "C:\Python35\lib\site-packages\sklearn\svm\base.py", line 230, in   
_dense_fit  
if X.shape[0] != X.shape[1]:  
IndexError: tuple index out of range  

我嘗試了不同的方法,但我無法按照我的要求格式化我的數據集,請告訴我一個方法來做到這一點。

我對SVC kernel論證的工作原理感到困惑。 你擁有它不僅僅是內核函數radial_basis ; 它實際上必須返回Gram矩陣 您可以在sklearn文檔中看到:

http://scikit-learn.org/stable/modules/svm.html#custom-kernels

總結該部分:您有兩個選擇。

(1)將Gram矩陣直接插入fit()方法(不僅僅是普通的X_train ),並使用kernel='precomputed' ; 要么

(2)編寫一個返回Gram矩陣的函數,然后將該函數傳遞給kernel

這個SO有很好的例子。 適應他們所寫的內容,你可以這樣做。 我將使用第二種方法,我會保留你原來的radial_basis作為插圖。

def radial_basis(x, y, gamma=10):
    return np.exp(-gamma * la.norm(np.subtract(x, y)))

def proxy_kernel(X, Y, K=radial_basis):
    """Another function to return the gram_matrix,
    which is needed in SVC's kernel or fit
    """
    gram_matrix = np.zeros((X.shape[0], Y.shape[0]))
    for i, x in enumerate(X):
        for j, y in enumerate(Y):
            gram_matrix[i, j] = K(x, y)
    return gram_matrix

clf_SVM_radial_basis = SVC(kernel=proxy_kernel) # Note that it's proxy_kernel here now
clf_SVM_radial_basis.fit(X_train, y_train)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM