Próbuję użyć scikit uczyć się 0.17 z anacondą 2.7 dla problemu klasyfikacji wielolabelowej. tutaj jest mój kodScikit Learn Multilabel Classification: ValueError: Wygląda na to, że używasz starszej wersji reprezentacji wielu etykiet
import pandas as pd
import pickle
import re
from sklearn.cross_validation import train_test_split
from sklearn.metrics.metrics import classification_report, accuracy_score, confusion_matrix
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB as MNB
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
traindf = pickle.load(open("train.pkl","rb"))
X, y = traindf['colC'], traindf['colB'].as_matrix()
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, train_size=0.7)
pip = Pipeline([
('vect', TfidfVectorizer(
analyzer='word',
binary=False,
decode_error='ignore',
dtype=<type 'numpy.int64'>,
encoding=u'utf-8',
input=u'content',
lowercase=True,
max_df=0.25,
max_features=None,
min_df=1,
ngram_range=(1, 1),
norm=u'l2',
preprocessor=None,
smooth_idf=True,
stop_words='english',
strip_accents=None,
sublinear_tf=True,
token_pattern=u'(?u)\\b\\w\\w+\\b',
tokenizer=nltk.data.load('tokenizers/punkt/english.pickle'),
use_idf=True, vocabulary=None)),
('clf', LogisticRegression(
C=10,
class_weight=None,
dual=False,
fit_intercept=True,
intercept_scaling=1,
max_iter=100,
multi_class='multinomial',
n_jobs=1,
penalty='l2',
random_state=None,
solver='lbfgs',
tol=0.0001,
verbose=0,
warm_start=False))
])
parameters = {}
gridSearchTS = GridSearchCV(pip,parameters,n_jobs=3, verbose=1, scoring='accuracy')
gridSearchTS.fit(Xtrain, ytrain)
predictions = gridSearchTS.predict(Xtest)
print ('Accuracy:', accuracy_score(ytest, predictions))
print ('Confusion Matrix:', confusion_matrix(ytest, predictions))
print ('Classification Report:', classification_report(ytest, predictions))
testdf = pickle.load(open("test.pkl","rb"))
predictions=gridSearchTS.predict(testdf['colC'])
testdf['colB'] = predictions
print(testdf.info())
testdf.to_csv("res.csv")
i tutaj jest to, co moje dane wygląda
szkolenie
colC colB
some text [list of tags]
some text [list of tags]
Test
colC
some text
some text
ale pojawia się błąd
raise ValueError('You appear to be using a legacy multi-label data'
ValueError: 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.
co to znaczy?
Oto pełny StackTrace
Traceback (most recent call last):
File "X:\asd.py", line 34, in getTags
gridSearchTS.fit(Xtrain, ytrain)
File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\grid_search.py", line 804, in fit
return self._fit(X, y, ParameterGrid(self.param_grid))
File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\grid_search.py", line 532, in _fit
cv = check_cv(cv, X, y, classifier=is_classifier(estimator))
File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\cross_validation.py", line 1676, in check_cv
if type_of_target(y) in ['binary', 'multiclass']:
File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\utils\multiclass.py", line 251, in type_of_target
raise ValueError('You appear to be using a legacy multi-label data'
ValueError: 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.
jak to naprawić? czy muszę zmienić format moich danych? dlaczego gridSearchTS.fit (Xtrain, ytrain) zawodzi? Jak ustawić X i Y odpowiednie dla funkcji dopasowania?
Edit
Próbowałem
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)
ale teraz ja dostać
ValueError: could not convert string to float: <value of ColC here>
na
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
Czy muszę również binaryzować X? dlaczego muszę przekonwertować wymiar X na zmiennoprzecinkowe?
Powiedziałbym, że komunikat o błędzie jest całkiem jasny. Której części nie rozumiesz? – Evert
jak to naprawić? czy muszę zmienić format moich danych? dlaczego gridSearchTS.fit (Xtrain, ytrain) zawodzi? jak sprawić, aby X i y były odpowiednie dla funkcji dopasowania? – AbtPst
Te drugie i czwarte pytanie są jaśniejsze niż początkowe "co to znaczy?" pytanie. Możesz zaktualizować swoje pytanie, aby je wprowadzić. – Evert