Использование функции prec_proba() RandomForestClassifier безопасным и правильным способом
Я использую Scikit-learn для применения алгоритма машинного обучения на моих наборах данных. Иногда мне нужно иметь вероятности меток/классов, созданных самими ярлыками/классами. Вместо того, чтобы Spam/Not Spam как ярлыки электронных писем, я хочу иметь только, например: 0.78 вероятность, что данное письмо является спамом.
Для этой цели я использую optim_proba() с RandomForestClassifier следующим образом:
clf = RandomForestClassifier(n_estimators=10, max_depth=None,
min_samples_split=1, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())
classifier = clf.fit(X,y)
predictions = classifier.predict_proba(Xtest)
print(predictions)
И я получил эти результаты:
[ 0.4 0.6]
[ 0.1 0.9]
[ 0.2 0.8]
[ 0.7 0.3]
[ 0.3 0.7]
[ 0.3 0.7]
[ 0.7 0.3]
[ 0.4 0.6]
Где второй столбец для класса: Спам. Однако у меня есть две основные проблемы с результатами, о которых я не уверен. Первая проблема заключается в том, что результаты представляют вероятности меток, не подверженных влиянию размера моих данных? Вторая проблема заключается в том, что результаты показывают только одну цифру, которая не очень специфична в некоторых случаях, когда вероятность 0,701 сильно отличается от 0,708. Есть ли способ получить следующие 5 цифр, например?
Большое спасибо заранее за то, что вы прочитали эти два вопроса и их вопросы.
Ответы
Ответ 1
-
Я получаю больше чем одну цифру в моих результатах, вы уверены, что это связано не с вашим набором данных? (например, использование очень маленького набора данных приведет к простым деревьям решений и, следовательно, к "простым" вероятностям). В противном случае это может быть только дисплей, который показывает одну цифру, но попытайтесь распечатать predictions[0,0]
.
-
Я не уверен, что понимаю, что вы имеете в виду под "вероятностью не зависит размер моих данных". Если вы обеспокоены тем, что вы не хотите прогнозировать, например, слишком много спама, то обычно делается так, чтобы использовать пороговое значение t
, так что вы прогнозируете 1, если proba(label==1) > t
. Таким образом, вы можете использовать порог, чтобы сбалансировать ваши прогнозы, например, чтобы ограничить глобальную вероятность спама. И если вы хотите глобально проанализировать свою модель, мы обычно вычисляем область под кривой (AUC) кривой рабочей характеристики приемника (ROC) (см. Статью в Википедии здесь). В основном кривая ROC представляет собой описание ваших прогнозов в зависимости от порога t
.
Надеюсь, поможет!
Ответ 2
RandomForestClassifier
- это коллекция DecisionTreeClassifier
. Независимо от того, насколько большой ваш набор тренировок, дерево решений просто возвращает: решение. Один класс имеет вероятность 1, другие классы имеют вероятность 0.
RandomForest просто голосует среди результатов. predict_proba()
возвращает количество голосов для каждого класса (каждое дерево в лесу принимает свое решение и выбирает ровно один класс), деленное на количество деревьев в лесу. Следовательно, ваша точность точно равна 1/n_estimators
. Хотите больше "точности"? Добавьте оценки. Если вы хотите увидеть вариацию на 5-й цифре, вам понадобится 10**5 = 100,000
оценок, что является чрезмерным. Обычно вы не хотите более 100 оценок, и часто их не так много.