Как маркировать особые случаи в RandomForestRegressor в sklearn в python - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть набор числовых функций (f1, f2, f3, f4, f5) для каждого пользователя в моем наборе данных, как указано ниже.

       f1   f2  f3  f4  f5
user1  0.1  1.1  0 1.7  1
user2  1.1  0.3  1 1.3  3
user3  0.8  0.3  0 1.1  2
user4  1.5  1.2  1 0.8  3
user5  1.6  1.3  3 0.3  0

Мой целевой вывод - список пользователей с приоритетом.то есть, как показано в примере ниже.

       f1   f2  f3  f4  f5  target_priority
user1  0.1  1.1  0 1.7  1       2
user2  1.1  0.3  1 1.3  3       1
user3  0.8  0.3  0 1.1  2       5
user4  1.5  1.2  1 0.8  3       3
user5  1.6  1.3  3 0.3  0       4

Я хочу использовать эти функции таким образом, чтобы отражать приоритет пользователя.В настоящее время я использую sklearns RandomForestRegressor` для выполнения этой задачи.

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

Пример (Как выглядит реальный набор данных):

       f1   f2  f3  f4  f5  target_priority
user1  0.1  1.1  0 1.7  1       2
user2  1.1  0.3  1 1.3  3       2
user3  0.8  0.3  0 1.1  2       N/A
user4  1.5  1.2  1 0.8  3       N/A
user5  1.6  1.3  3 0.3  0       1

В таких особых случаях (у которых нет priority label), хорошо ли дать им специальный символ илиуровень приоритета, который намного ниже существующих приоритетов (например, 100000000000000000 priority)? Как обрабатываются такие особые случаи в RandomForestRegressor?

Я с удовольствием предоставлю более подробную информацию, если это необходимо?

1 Ответ

0 голосов
/ 25 февраля 2019

Хорошо, если 80-90% не нуждается в приоритете, вы должны создать классификатор, который решает, нужно ли назначать приоритет или нет, так как это будет перекос класса, я бы порекомендовал вам использовать дерево решений илиОбнаружение аномалий в качестве классификатора, точки данных, которые требуют приоритета, будут аномалией, вы можете использовать Sklearn для них.

После определения объектов, которым необходимо присвоить приоритет, я рассмотрю распределение данных обученияЧто касается приоритетов, вы сказали, что приоритеты варьируются от 1 до 100, поэтому, если у вас есть по крайней мере 5000 точек данных и у каждого уровня приоритета есть по крайней мере 35 примеров, я бы предложил многоклассовый классификатор (предпочтительно SVC с ядром rbf) и путаницуматрица для проверки точности матрицы, если это не сработает. Вам нужно будет использовать регрессор для данных, а затем округлить ответ.

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

Изменить для кода

ОКтак что давайте возьмем его сверху, во-первых, либо в вашей цели значения NA хранятся как np.nan, либо как символы ?, либо как прямой текст N.A., во всех случаях это приведет к вашей целевой меткебудучи объектом типа, для проверки используйте df[['target']].dtypes, если он говорит int или float, вы можете пропустить первый шаг, но если он говорит object, то нам нужно сначала исправить это.

df.loc[df['Target'] == 'N.A.', 'Target'] = np.nan #np = Numpy `N.A.` can be any placeholder that is being used by tour dataset for N.A. values.
df[['target']] = df[['target']].astype(float)

Теперь давайтеперейдите ко второй части, где вам нужно получить цель для вашего классификатора, для этого используйте

df2 = pd.DataFrame()
df2['Bool'] = df[['Target']] != np.nan
df1 =  pd.concat([df, df2], axis = 1)
df1.head() #Sanity check

. Это обновит ваш фрейм данных, добавив true всякий раз, когда был назначен приоритет, этот столбец будет вашей цельюваш классификатор. Обратите внимание , используя df1, а не df, теперь отбросьте Target с df1, как это не важно, для первой части.df1.drop(['Target'], axis = 1, inplace = True)

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

Идем дальше, чтобы построить классификатор случайных лесов

clf = RandomForestClassifier(n_estimators=100, max_depth=2) #Note max depth is a hyper parameter and you will need to tune it.
clf.fit (df1.drop(['Bool'],axis=1),df1['Bool'])

Чтобы удалить строки, в которых вывод ложен

df1 = df1[df['Bool'] == True]

Затем просто используйте clf.predict() для новых данных,Удалите строки, в которых выходные данные имеют значение false, и запустите регрессор для оставшихся данных.Я предполагаю, что вы можете сделать часть регрессора, так как теперь она полностью прямолинейна.Дайте мне знать, если у вас возникнут какие-либо проблемы.

...