Как использовать обученную модель для другого набора данных в Sklearn's Random Forest Classifier? - PullRequest
0 голосов
/ 06 декабря 2018

Обновление: некоторая «терминология»
Пример: строка
объекты: столбцы
'метки': классы для прогноза (один столбец среди функций).

В основном мне интересно: у меня набор данных1 и набор данных2 идентичны по форме и размеру.После обучения и тестирования с набором данных1 я использую эту модель для прогнозирования набора данных2.(Количество функций также одинаково).

Если я прогнозирую все элементы в наборе данных2, точность будет близка к результатам теста набора данных1.Но если я выберу 1 предмет для каждого класса из набора данных 2, точность составит около 30%.Как это возможно, что полная точность набора данных 2 радикально отличается от «субсэмплированного» набора данных 2?

Я использую RandomForestClassifier.

У меня есть набор данных с выборкой 200K (строки), имеющиеоколо 90 классов.После обучения и тестирования точность достаточно высока (около ~ 96%).

Теперь, когда у меня есть обученная модель, я использую другую другую базу данных (опять же с 200 K выборками и 90 классами), чтобы делать прогнозы.

Если я отправлю все образцы из этой второй базы данных, точность будет достаточно близка к точности обучения (около ~ 92%).

Но если я выберу 90 образцов (по одному из каждого класса) из этогоВторая точность базы данных не то, что я ожидал.(около ~ 30%)

.... data preprocessing is done.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier(n_estimators=nestimators, bootstrap=False, 
class_weight=None, criterion='entropy',
        max_features='auto', max_leaf_nodes=None,
        min_impurity_decrease=0.0, min_impurity_split=None,

        min_weight_fraction_leaf=0.0, n_jobs=6,
        oob_score=False, random_state=np.random.seed(1234), verbose=0, warm_start=False)
clf.fit(X_train,y_train)
y_pred=clf.predict(X_test)    

from sklearn import metrics
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

и точность около ~ 96%.

Теперь я использую эту обученную модель с новой базой данных (идентичной по форме):

df2=pd.read_csv("newdata.csv", low_memory=False, skipinitialspace=True, na_filter=False)
features=['col1','col2','col3','col4']
Xnew=df2[features].values
ynew=df2['labels'].values  # Labels
y_prednew=clf.predict(Xnew)

Точность выше ~ 90%.Близко к первой точности базы данных.Но

Если я отфильтрую этот новый набор данных для 1 выборки для каждого класса следующим образом:

df2=pd.read_csv("newdata.csv", low_memory=False, skipinitialspace=True, na_filter=False)

samplesize=1
df2=df2.sample(frac=1)
df2=df2.groupby('labels')
df2=df2.head(samplesize).reset_index(drop=True)

features=['col1','col2','col3','col4']
Xnew=df2[features].values
ynew=df2['labels'].values  # Labels
y_prednew=clf.predict(Xnew)

... точность будет ~ 35%.Но если я не отфильтрую эти новые данные и передам их в модель, точность будет выше ~ 90%.

Первый и второй наборы данных идентичны по форме.Если я предоставлю все образцы из второго набора данных этой обученной модели, точность будет близка к результатам первого набора данных.Но если я отфильтрую его по 1 выборке из каждого класса, точность составит ~ 30%.

Я не знаю, где я допустил ошибку.

1 Ответ

0 голосов
/ 06 декабря 2018

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

Классическим примером является некоторая чрезвычайно несбалансированная задача двоичной классификации, где 99% выборок являются положительными.Всегда прогнозируя положительный результат, можно получить точность 99%, но выборка из 1 точки данных для каждого класса будет иметь точность 50% (и хотя точность вне контекста может показаться хорошей, модель не очень полезна).

Я бы рекомендовал проверить частоты класса, а также использовать другие метрики (см. точность , отзыв и f1 ) с соответствующим параметром averageдля более точной оценки производительности вашей модели.

Подводя итог, можно сказать, что точность 90% + для всего набора данных и точность 30% для выборки из 1 точки данных для каждого класса не обязательно противоречат друг другу, например, если классы нене сбалансированы в наборе данных.

Редактировать: Короче говоря, я пытаюсь сказать, что это может быть, вы испытываете Парадокс точности .

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