Как сравнить обученные по признакам классификаторы с отсутствующими данными? - PullRequest
0 голосов
/ 04 июля 2018

Допустим, у меня есть набор обучающих данных с двумя числовыми характеристиками A и B и n выборок, которые все помечены в двоичном виде (двоичная классификация) проблема).

   A    B   Label
   -------- -----
0  0.1  0.9     x
1  0.7  NaN     x
2  0.3  NaN     y
3  0.1  0.2     x
...
n  0.1  0.3     y

Также предположим, что у объекта A нет пропущенных значений, тогда как у объекта B есть m пропущенных значений (отображается как NaN, m > 0).

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

Проблема в том, что некоторые фреймворки, такие как scikit learn не допускают значения NaN, поэтому я должен избавиться от них, либо отбрасывая их, либо вменяя значения.

Допустим, я отбрасываю все м NaN значений свойства B . Затем я обучаю классификатор по признаку A с n выборками, тогда как я обучаю тот же классификатор по признаку B только с n - m образцы. Конечно, оба дают стандартные метрики оценки, но я больше не могу их напрямую сравнивать, или я могу?

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

Мой вопрос сейчас заключается в том, как на самом деле провести звуковое сравнение классификатора, который был обучен по функции, без пропущенных данных, с классификатором, который был обучен по функции с (потенциально большим количеством) пропущенных данных?

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Отсутствие значений является распространенной проблемой, и есть несколько способов справиться с этим, как вы уже упоминали. Существует действительно проблема, когда вы пытаетесь заменить некоторые произвольные значения. Часто NaN заменяется на 0 или среднее значение столбца, но это зависит от того, что представляют данные. В вашем случае одним из способов может быть прогнозирование этих значений с использованием ML, если только в одном столбце содержатся недостающие данные, и все же это зависит от того, насколько конфиденциальны ваши данные.

0 голосов
/ 04 июля 2018

Вы можете заменить все значения NaN статическим числом, а затем запустить однофакторный селектор функций над ним. Бетон:

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

Пример:

from sklearn.cross_validation import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor

boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]

rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
for i in range(X.shape[1]):
     score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
                              cv=ShuffleSplit(len(X), 3, .3))
     scores.append((round(np.mean(score), 3), names[i]))
print(sorted(scores, reverse=True))

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

...