Использование функции 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

  1. Я получаю больше чем одну цифру в моих результатах, вы уверены, что это связано не с вашим набором данных? (например, использование очень маленького набора данных приведет к простым деревьям решений и, следовательно, к "простым" вероятностям). В противном случае это может быть только дисплей, который показывает одну цифру, но попытайтесь распечатать predictions[0,0].

  2. Я не уверен, что понимаю, что вы имеете в виду под "вероятностью не зависит размер моих данных". Если вы обеспокоены тем, что вы не хотите прогнозировать, например, слишком много спама, то обычно делается так, чтобы использовать пороговое значение 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 оценок, и часто их не так много.