3

i am trying to do multilabel classification using sci-kit learn 0.17 my data looks like

training

Col1                  Col2
asd dfgfg             [1,2,3]
poioi oiopiop         [4]

test

Col1                    
asdas gwergwger    
rgrgh hrhrh

my code so far

import numpy as np
from sklearn import svm, datasets
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier

def getLabels():
    traindf = pickle.load(open("train.pkl","rb"))
    X = traindf['Col1']
    y = traindf['Col2']

    # Binarize the output
    from sklearn.preprocessing import MultiLabelBinarizer  
    y=MultiLabelBinarizer().fit_transform(y)      

    random_state = np.random.RandomState(0)


    # Split into training and test
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,
                                                        random_state=random_state)

    # Run classifier
    from sklearn import svm, datasets
    classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
                                     random_state=random_state))
    y_score = classifier.fit(X_train, y_train).decision_function(X_test)

but now i get

ValueError: could not convert string to float: <value of Col1 here>

on

y_score = classifier.fit(X_train, y_train).decision_function(X_test) 

do i have to binarize X as well? why do i need to convert the X dimension to float?

AbtPst
  • 7,778
  • 17
  • 91
  • 172
  • "You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead." - did you see that? – Martin Thoma Dec 14 '15 at 20:13
  • how do i convert my labels to binary array? – AbtPst Dec 14 '15 at 20:20
  • Isn't [this](http://stackoverflow.com/questions/34213199/python-scikit-learn-multilabe-classification-valueerror-you-appear-to-be-usin) the same question? – erip Dec 14 '15 at 20:28
  • almost, but i am not using LogisticRegression here – AbtPst Dec 14 '15 at 20:31

1 Answers1

4

Yes, you must to transform X into numeric representation (not necessary binary) as well as y. That's because all machine learning methods operate on matrices of numbers.

How to do this exactly? If every sample in Col1 can have different words in it (i.e. it represents some text) - you can transform that column with CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer

col1 = ["cherry banana", "apple appricote", "cherry apple", "banana apple appricote cherry apple"]

cv = CountVectorizer()
cv.fit_transform(col1) 
#<4x4 sparse matrix of type '<class 'numpy.int64'>'
#   with 10 stored elements in Compressed Sparse Row format>

cv.fit_transform(col1).toarray()
#array([[0, 0, 1, 1],
#       [1, 1, 0, 0],
#       [1, 0, 0, 1],
#       [2, 1, 1, 1]], dtype=int64)
Ibraim Ganiev
  • 8,934
  • 3
  • 33
  • 52