2015-05-21 6 views
19

को देखते हुए एक सरल CSV फ़ाइल है:RandomForestClassfier.fit(): ValueError: कनवर्ट नहीं कर सके फ्लोट करने के लिए स्ट्रिंग

A,B,C 
Hello,Hi,0 
Hola,Bueno,1 

जाहिर असली डाटासेट में कहीं अधिक इस से जटिल है, लेकिन यह एक त्रुटि reproduces। मैं इतना है कि यह के लिए एक यादृच्छिक वन वर्गीकारक का निर्माण करने का प्रयास कर रहा हूँ:

cols = ['A','B','C'] 
col_types = {'A': str, 'B': str, 'C': int} 
test = pd.read_csv('test.csv', dtype=col_types) 

train_y = test['C'] == 1 
train_x = test[cols] 

clf_rf = RandomForestClassifier(n_estimators=50) 
clf_rf.fit(train_x, train_y) 

लेकिन मैं सिर्फ इस ट्रैस बैक जब लागू मिल फिट():

ValueError: could not convert string to float: 'Bueno' 

scikit सीखने संस्करण 0.16.1 है ।

उत्तर

25

फिट का उपयोग करने से पहले आपको कुछ एन्कोडिंग करना होगा। जैसा कि यह बताया गया था() स्ट्रिंग्स स्वीकार नहीं करता है लेकिन आप इसे हल करते हैं।

  • LabelEncoder:

    कई वर्गों है कि इस्तेमाल किया जा सकता हैं वृद्धिशील मूल्य

  • OneHotEncoder में अपने स्ट्रिंग बारी: का उपयोग एक-के-के एल्गोरिथ्म पूर्णांक में अपने स्ट्रिंग को बदलने के लिए

व्यक्तिगत रूप से मैंने कुछ समय पहले StackOverflow पर लगभग the same question पोस्ट किया है। मैं एक स्केलेबल समाधान चाहता था लेकिन मुझे कोई जवाब नहीं मिला। मैंने OneHotEncoder का चयन किया जो सभी तारों को बिनराइज़ करता है। यह काफी प्रभावी है लेकिन यदि आपके पास बहुत अलग स्ट्रिंग हैं तो मैट्रिक्स बहुत तेज़ी से बढ़ेगा और स्मृति की आवश्यकता होगी।

+0

धन्यवाद। अंततः मुझे डिक्टिवेटोरिज़र का उपयोग करके एक समाधान मिला। मुझे आश्चर्य है कि इस तरह के मुद्दों से निपटने के बेहतर दस्तावेज नहीं हैं। अगर मैं यहाँ पर्याप्त कर्म था तो मैं ऊपर उठ जाऊंगा। – nilkn

7

आप अपने मॉडल fit() विधि पर str पास नहीं कर सकते हैं। यह उल्लेख के रूप में here

The training input samples. Internally, it will be converted to dtype=np.float32 and if a sparse matrix is provided to a sparse csc_matrix.

तैरने लगते हैं और LabelEncoder को आजमाइए के लिए अपने डेटा बदलने की कोशिश करें।

+0

हुह, यह कैसे है वहाँ जो स्पष्ट रूप से उपयोग करने के उदाहरण हैं कि स्ट्रिंग डेटा? मुझे लगता है कि वे पुराने हैं या कुछ? – nilkn

+0

उदाहरण के लिए: http://nbviewer.ipython.org/github/ofermend/IPython-notebooks/blob/master/blog-part-1.ipynb – nilkn

+1

तो इससे निपटने का कैननिक तरीका क्या है? साइकोकिट-सीखने के साथ ऐसा करने का प्रयास करने वाला पहला व्यक्ति नहीं है। – nilkn

7

LabelEncoding मेरे लिए काम किया (मूल रूप से आप एन्कोड करने के लिए है अपने डेटा सुविधा के लिहाज से) (MyData स्ट्रिंग डेटाप्रकार का एक 2d सरणी है):

myData=np.genfromtxt(filecsv, delimiter=",", dtype ="|a20" ,skip_header=1); 

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
for i in range(*NUMBER OF FEATURES*): 
    myData[:,i] = le.fit_transform(myData[:,i]) 
1

मैं ने वही समस्या थी और पाया कि pandas.get_dummies() हल समस्या। विशेष रूप से, यह प्रत्येक इनपुट कॉलम में प्रत्येक अद्वितीय मान के लिए बूलियन कॉलम के सेट में स्पष्ट डेटा के कॉलम को विभाजित करता है।

train_x = pandas.get_dummies(test[cols]) 

यह निम्न रूप है, जो RandomForestClassifier स्वीकार कर सकते हैं में train_x Dataframe बदल देती है: आपके मामले में, आप के साथ train_x = test[cols] जगह लेंगे

C A_Hello A_Hola B_Bueno B_Hi 
0 0  1  0  0  1 
1 1  0  1  1  0 
संबंधित मुद्दे