Машинное обучение Случайные леса - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь разместить классификатор случайных лесов на несбалансированном наборе данных с помощью библиотеки Python scikit-learn.

Моя цель - получить более или менее одно и то же значение для возврата и точности, и для этого я использую параметр class_weight функции RandomForestClassifier.

При подборе Случайного леса с class_weight = {0: 1, 1: 1}, (другими словами, предполагая, что набор данных не сбалансирован), я получаю:

Точность: 0,79 Точность: 0,63 Напомним: 0,32 AUC: 0,74

Когда я изменяю class_weight на {0: 1, 1:10}, я получаю:

Точность: 0,79 Точность: 0,65 Напомним: 0,29 AUC: 0,74

Итак, значения отзыва и точности почти не изменились (даже если я увеличу с 10 до 100, изменения минимальны).

Поскольку X_train и X_test оба несбалансированы в одинаковых пропорциях (набор данных содержит более 1 миллиона строк), я не должен получать очень разные значения отзыва и точности при использовании class_weight = {0: 1, 1:10 }?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

В качестве дополнительного ответа вы также можете попытаться оптимизировать свою модель в соответствии с одним или несколькими показателями. Вы можете использовать RandomizedSearchCV , чтобы найти хорошую комбинацию гиперпараметров для вас. Например, если вы обучаете классификатор «Случайный лес»:

#model
MOD = RandomForestClassifier() 
#Implemente RandomSearchCV
m_params = { 
            "RF": {
                    "n_estimators" : np.linspace(2, 500, 500, dtype = "int"),  
                    "max_depth": [5, 20, 30, None], 
                    "min_samples_split": np.linspace(2, 50, 50, dtype = "int"),  
                    "max_features": ["sqrt", "log2",10, 20, None],
                    "oob_score": [True],
                    "bootstrap": [True]
                    },
            }
    scoreFunction = {"recall": "recall", "precision": "precision"}
    random_search = RandomizedSearchCV(MOD,
                                       param_distributions = m_params[model], 
                                       n_iter = 20,
                                       scoring = scoreFunction,               
                                       refit = "recall",
                                       return_train_score = True,
                                       random_state = 42,
                                       cv = 5,
                                        verbose = 1 + int(log)) 

    #trains and optimizes the model
    random_search.fit(x_train, y_train)

    #recover the best model
    MOD = random_search.best_estimator_

Обратите внимание, что оценка параметров и их повторная установка сообщат RandomizedSerachCV, какие показатели вам наиболее интересны в максимизации. Этот метод также сэкономит вам время на ручную настройку (и, возможно, наложение вашей модели на данные теста).

Удачи!

0 голосов
/ 01 ноября 2018

Если вы хотите увеличить отзыв вашей модели, есть гораздо более быстрый способ сделать это.

Вы можете вычислить точную кривую возврата , используя sklearn.

Эта кривая даст вам компромисс между точностью и отзывом для вашей модели.

Это означает, что если вы хотите увеличить отзыв своей модели, вы можете попросить случайный лес получить вероятности для каждого класса, добавить 0,1 к классу 1 и вычесть 0,1 к вероятности класса 0. Это будет эффективно увеличить ваш отзыв

Если вы построите кривую точного возврата, вы сможете найти оптимальный порог для равной точности и восстановить

Вот вам пример из sklearn

from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
import numpy as np

iris = datasets.load_iris()
X = iris.data
y = iris.target

# Add noisy features
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

# Limit to the two first classes, and split into training and test
X_train, X_test, y_train, y_test = train_test_split(X[y < 2], y[y < 2],
                                                    test_size=.5,
                                                    random_state=random_state)

# Create a simple classifier
classifier = svm.LinearSVC(random_state=random_state)
classifier.fit(X_train, y_train)
y_score = classifier.decision_function(X_test)

from sklearn.metrics import precision_recall_curve
import matplotlib.pyplot as plt
from sklearn.utils.fixes import signature

precision, recall, _ = precision_recall_curve(y_test, y_score)

# In matplotlib < 1.5, plt.fill_between does not have a 'step' argument
step_kwargs = ({'step': 'post'}
               if 'step' in signature(plt.fill_between).parameters
               else {})
plt.step(recall, precision, color='b', alpha=0.2,
         where='post')
plt.fill_between(recall, precision, alpha=0.2, color='b', **step_kwargs)

plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])

Что должно дать вам что-то вроде это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...