Хорошо, если 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, и запустите регрессор для оставшихся данных.Я предполагаю, что вы можете сделать часть регрессора, так как теперь она полностью прямолинейна.Дайте мне знать, если у вас возникнут какие-либо проблемы.