2015-08-07 3 views
0

Работа над проблемой классификации с использованием python scikit, ее данных медицинской диагностики, имеющих 6 функций и 2 цели. Я попытался с одной целью, обучил модель с использованием алгоритма KNN, точность прогноза составляет 100% с этой моделью.Прогнозирование исхода нескольких целей в SciKit-Learn

Теперь вы хотите расширить это на вторую цель, хотите предсказать результат двух значений y для одного и того же набора функций (6 столбцов).

Ниже приведен мой код, где Im способен точно предсказать результат цели 1 («Результат1-Мочевой пузырь»). Как я могу расширить, чтобы предсказать результат второй цели (результат 2-нефрит-почечная).

X = Feature_set 
y = Target1['Outcome1-Urinary-bladder'].values 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn import metrics 
knn = KNeighborsClassifier(n_neighbors=1) 
knn.fit(X,y) 
y_predictor = knn.predict(X) 
print metrics.accuracy_score(y,y_predictor) 

Click here to view the dataset

Какие изменения должны быть внесены в код, чтобы предсказать исход 2 целевых значений ('Outcome1-Мочевой пузыря' & Outcome2-Нефрит-оф-почечной)?

Пожалуйста, помогите мне. Заранее спасибо.

+1

'KNeighborsClassifier' поддерживает несколько выходов. – yangjie

+2

Вне темы, но вы должны понимать, что точность должна оцениваться с использованием кросс-валидации для значимого обобщения; в вашем коде выше вы оцениваете производительность своей модели, используя тот же набор, который вы обучили – Ryan

+2

В частности, используя KNeighborsClassifier с n_neighbors = 1, вы всегда будете иметь 100% -ную точность в своем учебном наборе, не изучая ничего. –

ответ

-1

В общем, вы просто обернуть классификатор в один-против-отдыха классификаторов обертке:

http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html#sklearn.multiclass.OneVsRestClassifier

И кормить его с матрицей у, которая будет иметь 2 колонки одновременно.

Пример использования:

selClassifiers = { 
    'linear': LinearSVC(), 
    'linearWithSGD': SGDClassifier(), 
    'rbf': SVC(kernel='rbf', probability=True), 
    'poly': SVC(kernel='poly', probability=True), 
    'sigmoid': SVC(kernel='sigmoid', probability=True), 
    'bayes': MultinomialNB() 
} 

classifier = Pipeline([('vectorizer', CountVectorizer()),('tfidf', TfidfTransformer()),('clf', OneVsRestClassifier(selClassifiers[classif]))]) 

classifier.fit(X_train, Y) 

predicted = classifier.predict(X_test) 

all_labels = lb.inverse_transform(predicted) 

Как указано на @yangjie, для конкретного классификатора нет необходимости, чтобы обернуть его, она уже поддерживает мультитач выходную классификацию.

+0

В «OneVsRestClassifier» нет необходимости обертывать. – yangjie

+1

Да - в текущем случае. Но если бы он использовал другой классификатор, это было бы необходимо, особенно если оно использовалось с конвейером. Кроме того, оболочка дает больше контроля над поведением, предоставляя возможность указывать количество заданий. Я говорю об общем случае. –

Смежные вопросы