Обновление: некоторая «терминология»
Пример: строка
объекты: столбцы
'метки': классы для прогноза (один столбец среди функций).
В основном мне интересно: у меня набор данных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%.
Я не знаю, где я допустил ошибку.