2013-11-27 44 views
4

我試圖使用rfecv縮小與分類器真正相關的功能數量。這是我寫ValueError:未知在sklearn中不支持.RFECV

import sklearn 
import pandas as p 
import numpy as np 
import scipy as sp 
import pylab as pl 
from sklearn import linear_model, cross_validation, metrics 
from sklearn.svm import SVC 
from sklearn.feature_selection import RFECV 
from sklearn.metrics import zero_one_loss 
from sklearn import preprocessing 
#from sklearn.feature_extraction.text import CountVectorizer 
#from sklearn.feature_selection import SelectKBest, chi2 

modelType = "notext" 

# ---------------------------------------------------------- 
# Prepare the Data 
# ---------------------------------------------------------- 
training_data = np.array(p.read_table('F:/NYC/NYU/SM/3/SNLP/Project/Data/train.tsv')) 
print ("Read Data\n") 

# get the target variable and set it as Y so we can predict it 
Y = training_data[:,-1] 

print(Y) 

# not all data is numerical, so we'll have to convert those fields 
# fix "is_news": 
training_data[:,17] = [0 if x == "?" else 1 for x in training_data[:,17]] 

# fix -1 entries in hasDomainLink 
training_data[:,14] = [0 if x =="-1" else x for x in training_data[:,10]] 

# fix "news_front_page": 
training_data[:,20] = [999 if x == "?" else x for x in training_data[:,20]] 
training_data[:,20] = [1 if x == "1" else x for x in training_data[:,20]] 
training_data[:,20] = [0 if x == "0" else x for x in training_data[:,20]] 

# fix "alchemy category": 
training_data[:,3] = [0 if x=="arts_entertainment" else x for x in training_data[:,3]] 
training_data[:,3] = [1 if x=="business" else x for x in training_data[:,3]] 
training_data[:,3] = [2 if x=="computer_internet" else x for x in training_data[:,3]] 
training_data[:,3] = [3 if x=="culture_politics" else x for x in training_data[:,3]] 
training_data[:,3] = [4 if x=="gaming" else x for x in training_data[:,3]] 
training_data[:,3] = [5 if x=="health" else x for x in training_data[:,3]] 
training_data[:,3] = [6 if x=="law_crime" else x for x in training_data[:,3]] 
training_data[:,3] = [7 if x=="recreation" else x for x in training_data[:,3]] 
training_data[:,3] = [8 if x=="religion" else x for x in training_data[:,3]] 
training_data[:,3] = [9 if x=="science_technology" else x for x in training_data[:,3]] 
training_data[:,3] = [10 if x=="sports" else x for x in training_data[:,3]] 
training_data[:,3] = [11 if x=="unknown" else x for x in training_data[:,3]] 
training_data[:,3] = [12 if x=="weather" else x for x in training_data[:,3]] 
training_data[:,3] = [999 if x=="?" else x for x in training_data[:,3]] 

print ("Corrected outliers data\n") 

# ---------------------------------------------------------- 
# Models 
# ---------------------------------------------------------- 
if modelType == "notext": 
    print ("no text model\n") 
    #ignore features which are useless 
    X = training_data[:,list([3, 5, 6, 7, 8, 9, 10, 14, 15, 16, 17, 19, 20, 22, 25])] 
    scaler = preprocessing.StandardScaler() 
    print("initialized scaler \n") 
    scaler.fit(X,Y) 
    print("fitted train data and labels\n") 
    X = scaler.transform(X) 
    print("Transformed train data\n") 
    svc = SVC(kernel = "linear") 
    print("Initialized SVM\n") 
    rfecv = RFECV(estimator = svc, cv = 5, loss_func = zero_one_loss, verbose = 1) 
    print("Initialized RFECV\n") 
    rfecv.fit(X,Y) 
    print("Fitted train data and label\n") 
    rfecv.support_ 
    print ("Optimal Number of features : %d" % rfecv.n_features_) 
    savetxt('rfecv.csv', rfecv.ranking_, delimiter=',', fmt='%f') 

在「(X,Y)rfecv.fit」的調用的代碼我的代碼從metrices.py文件拋出一個錯誤「ValueError異常:未知,不支持」

sklearn.metrics.metrics錯誤豆芽:

# No metrics support "multiclass-multioutput" format 
    if (y_type not in ["binary", "multiclass", "multilabel-indicator", "multilabel-sequences"]): 
     raise ValueError("{0} is not supported".format(y_type)) 

這是一個分類問題,目標值只有0或1 該數據集可以在Kaggle Competition Data

可以找到

如果任何人都可以指出我要出錯的地方,我將不勝感激。

+0

歡迎來到SO!雖然您的問題(Q)格式良好,但很容易重現錯誤,但有一些改進建議您記住您的下一個Q(如果有的話)。你的Q包含很多重複和代碼,例如導入,代碼與錯誤無關,較小的代碼更具可讀性。其次,您的數據太大,需要加載登錄。您可以通過樣本數據(前幾行)檢查是否存在錯誤,並將其包含在您的Q中。這樣可以獲得更多的關注,並且會得到更好更快的回答。對sklearn和SO有很好的體驗! – alko

回答

5

RFECV檢查目標/火車數據是類型binarymulticlassmultilabel-indicatormultilabel-sequences之一:

  • '二進制':y包含< = 2的離散值和是1D或列 向量。
  • '多類':y包含多於兩個離散值,不是 序列序列,並且是1d或列向量。
  • 「mutliclass-多輸出」:y是包含多個 比兩個離散值的2D陣列,是不是序列的序列,並且兩個 尺寸大小> 1
  • 「多標記指示符」的:y是標籤指示符矩陣,具有至少兩列的兩維數組以及至多2個唯一值的數組。

而你Yunknown,即

  • 「未知」:y是陣列狀,但沒有上述,諸如3D陣列,或非序列對象的數組。

的原因是你的目標數據串(形式"0""1")並裝有read_table爲對象:

>>> training_data[:, -1].dtype 
dtype('O') 
>>> type_of_target(training_data[:, -1]) 
'unknown' 

爲了解決這個問題,你可以轉換爲int

>>> Y = training_data[:, -1].astype(int) 
>>> type_of_target(Y) 
'binary' 
+0

你是一個拯救生命的人。謝謝 會記住你的建議! – XConfusion

+0

@alko - 你必須轉換成什麼類型​​才能獲得'multiclass'?你需要使用分解函數嗎?另外''type_of_target'函數似乎不適合我。這是你寫的功能嗎? – skmathur

+0

請參考http://scikit-learn.org/stable/modules/multiclass.html和https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/utils/multiclass.py# L177 – alko

相關問題