2017-03-21 70 views
0

在使用scikit-learn實現線性SVM時存在屬性錯誤問題。我正在使用通過RFECV方法進行交叉驗證的線性分類器,並且我無法訪問SVC的任何屬性。不確定它是否與特徵選擇或基本模型有關。sklearn中的屬性錯誤svm.SVC

model = svm.SVC(kernel='linear') 
    selector=RFECV(model) 
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=pct_test) 
    selector=selector.fit(X_train, Y_train) 
    my_prediction = selector.predict(X_test) 
    f1.append(metrics.f1_score(Y_test, my_prediction)) 
    kappa.append(metrics.cohen_kappa_score(Y_test, my_prediction)) 
    precision.append(metrics.precision_score(Y_test, my_prediction)) 
    recall.append(metrics.recall_score(Y_test, my_prediction)) 
    print model.intercept_ 
    print model.support_vectors_ 
    print model.coef_ 

度量工作正常,屬性都失敗。 的錯誤信息是:

AttributeError的: 'SVC' 對象有 'intercept_'

文檔沒有屬性:http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC

題外話:我很新的面向對象編程。如果我缺少一個基本概念,請詳細說明或發送一個鏈接。

回答

0

您正在爲RFECV對象selector擬合(訓練數據),但嘗試訪問SVC對象model的屬性。但它沒有受過訓練。因此其中沒有屬性intercept_

要訪問SVC的攔截,你應該使用:

selector.estimator_.intercept_ 

但要知道的是,上述估算是隻安裝在減少數據集

解釋(消除功能,如指定後):

您會發現,RFECV在內部使用RFE來獲取每次迭代中的重要特徵。 RFE爲此目的克隆提供的估算器。所以當你用model初始化RFECV時,它就是通過模型的克隆進行訓練的。 檢查source code

線407(RFECV擬合方法內側):

rfe = RFE(estimator=self.estimator, 
      n_features_to_select=n_features_to_select, 
      step=self.step, verbose=self.verbose) 

線428(用於估計分數):

scores = parallel(func(rfe, self.estimator, X, y, train, test, scorer) 
         for train, test in cv.split(X, y)) 

然後165線(內配合RFE法):

estimator = clone(self.estimator) 
+0

一個非常徹底的解釋。謝謝! – user7748226