- Вопрос или проблема
- Ответ или решение
- Проблемы многоклассовой классификации с плохой точностью предсказаний: анализ и рекомендации
- 1. Понимание данных
- Структура данных
- Проблема с зависимой переменной
- 2. Проверка кода
- Разделение выборки
- Модель и ее настройки
- 3. Улучшение качества данных
- Очистка данных
- Снижение размерности
- Выбор признаков
- 4. Оценка модели
- Метрики
- Улучшение отчетности
- Заключение
Вопрос или проблема
Я пытался это исправить в течение 2 месяцев, но без успеха. Я провожу медицинское исследование для своей учебы. У меня есть набор данных, в котором указаны диагнозы пациентов на основе медицинских отчетов (Features.csv), и у каждого пациента на основе этого медицинского отчета есть список болезней (Results.csv).
Вот образец каждого файла.
Features.csv
filename code frequency
1006 53438000 2
1006 54706004 10
1006 65801008 1
1006 66842004 10
1006 70901006 11
1006 71388002 1
1006 71651007 1
1006 71960002 2
1006 73761001 2
1006 74016001 1
1006 77477000 1
1007 105011006 1
1007 34896006 1
1007 363680008 2
1007 399208008 2
1007 52765003 1
1007 57485005 1
1007 71388002 3
1007 73632009 1
1007 767002 1
1007 86273004 2
1008 34227000 1
1008 363679005 1
1008 42525009 1
1008 67166004 1
1008 71388002 1
1008 90205004 1
1009 104866001 1
1009 113011001 1
1009 113063008 1
1009 118635009 2
1009 122462000 1
1009 16310003 6
1009 165581004 1
1009 168537006 2
1009 169070004 1
Это Results.csv
filename result order
1006 5990 2
1006 7802 3
1006 2762 4
1006 2738 5
1006 4589 6
1006 V4575 7
1006 27651 8
1006 56400 9
1006 4019 10
1006 V103 11
1006 2449 12
1006 2724 13
1006 56210 14
1006 2859 15
1006 5779 16
1006 5566 1
1007 1892 1
1007 1970 2
1007 496 3
1007 4280 4
1007 51881 5
1007 2859 6
1007 4019 7
1007 V1011 8
1008 4321 1
1008 41400 2
1008 4019 3
1008 2724 4
1008 71590 5
1008 V4581 6
1009 0389 1
1009 5789 2
1009 5761 3
1009 5845 4
1009 51881 5
1009 1552 6
1009 5990 7
1009 4280 8
1009 5762 9
1009 57511 10
1009 25000 11
1009 V5867 12
1009 99592 13
1009 0413 14
Я сделал это в своем коде на Python
1- Загрузить набор данных.
2- Пивотировать признаки, чтобы коды были в столбцах, а частота – значением
filename 53438000 54706004 ... 90205004
1006 2 10 0
1007 0 0 0
1008 0 0 0
1009 0 0 0
3- Пивотировать результаты и поместить значения в массив
1006 [5990, 7802, ...]
1007 [1892, 1970, ...]
4- Однократное кодирование результатов
filename 1892 1970 .... 5990 7802 ...
1006 0 0 1 1
1007 1 1 0 0
5- Разделить набор данных на обучение и тест (80/20)
6- Использовать LogisticRegression
7- Проверить точность
Точность, которую я получаю, очень плохая
и когда я пытаюсь изменить код, я получаю предсказания с только 1!
Что я делаю не так?
Как я могу улучшить точность?
Вот полные файлы.
Features
Results
и вот мой код.
import pyodbc
import pandas as pd
import numpy as np
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import f1_score
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
RecNo = "0"
pd.set_option('display.max_colwidth', 300)
conn = pyodbc.connect('Driver={SQL Server};'
'Server=DELLG3;'
'Database=NLP2;'
'Trusted_Connection=yes;')
df_features = pd.read_sql("EXEC GetFeatures " + RecNo , conn)
df_features.shape
df_results = pd.read_sql("EXEC GetResults " + RecNo , conn)
df_features = df_features.pivot(index='filename', columns="code", values="frequency")
df_features[np.isnan(df_features)] = 0
df_results = df_results.groupby('filename')[["result"]].agg(list).reset_index()
multilabel_binarizer = MultiLabelBinarizer()
multilabel_binarizer.fit(df_results['result'])
ResultsArray = multilabel_binarizer.transform(df_results['result'])
ResultsArray = ResultsArray[:, :-1]
xtrain, xval, ytrain, yval = train_test_split(df_features, ResultsArray, test_size=0.2, random_state=9)
lr = LogisticRegression()
clf = OneVsRestClassifier(lr)
# Обучите модель на обучающих данных
clf.fit(xtrain, ytrain)
# Сделайте предсказания для валидационного набора
y_pred = clf.predict(xval)
# Оцените производительность
print(f1_score(yval, y_pred, average="micro"))
# Я получаю точность этого разбиения
ac=accuracy_score(y_pred,yval)
# Я получаю матрицу путаницы
cm=confusion_matrix(yval.ravel(), y_pred.ravel())
TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]
print(TN,FN,TP,FP)
Похоже, filename
является вашей зависимой переменной, а некоторые features
являются многомаркерными выходами, как в 4- Однократное кодирование результатов.
Если это так, собираетесь ли вы обучать модель на filename
или содержимом файла
?
Пожалуйста, проверьте это.
Исправьте меня, если я неправильно понял.
Уточните о вашем X и y.
Ответ или решение
Проблемы многоклассовой классификации с плохой точностью предсказаний: анализ и рекомендации
В вашем случае вы сталкиваетесь с задачей многоклассовой классификации с использованием медицинских данных. Проблема с низкой точностью предсказаний может возникать по ряду причин. Давайте разберем вашу ситуацию подробно и предложим возможные решения.
1. Понимание данных
Структура данных
Вы имеете две таблицы:
- Features.csv: содержит медицинские коды и их частоту по каждому пациенту.
- Results.csv: содержит результаты, где каждому пациенту соответствует набор заболеваний.
Согласно вашему коду, вы успешно преобразуете данные в формат, который удобен для обучения модели, однако стоит детально проанализировать, как происходит формирование матрицы признаков и целевой переменной.
Проблема с зависимой переменной
Вы правильно заметили, что данные в поле result
являются многозначными. Это значит, что для каждого пациента может быть несколько диагнозов. Если вы просто выполните "one hot encoding" для заболеваний, вам нужно будет также убедиться, что модель, которую вы обучаете, способна работать с многозначными метками. Вы используете OneVsRestClassifier
, что является хорошим шагом, однако есть некоторые моменты, которые стоит учитывать.
2. Проверка кода
Разделение выборки
В вашем коде вы используете train_test_split
, но убедитесь, что сочетание пациентов в обучающей и тестовой выборках корректно, и что вы не проверяете модель на тех же экземплярах, на которых она обучалась.
Модель и ее настройки
Перед тем как принять решение, следует провести лучшее понимание того, как ваша модель ведет себя. Вы можете использовать разные алгоритмы и проводить их сравнение:
-
Сложные алгоритмы: Попробуйте использовать более сложные модели, такие как случайный лес, градиентный бустинг или нейронные сети. Эти модели могут лучше справляться с высокоразмерными данными и сложными паттернами.
-
Кросс-валидация: Использование кросс-валидации может помочь вам лучше оценить качество модели и избежать проблем с переобучением.
3. Улучшение качества данных
Очистка данных
Согласно вашему коду, вы обрабатываете пропуски заменяя их на нули, однако стоит удостовериться, что данные не содержат выбросов или аномалий.
Снижение размерности
Если у вас слишком много признаков, это может привести к проблемам с переобучением модели и плохой обобщающей способности. Рассмотрите возможность использования методов снижения размерности, таких как PCA (метод главных компонент) или t-SNE.
Выбор признаков
Попробуйте выполнить отбор признаков (feature selection), чтобы определить, какие именно признаки влияют на предсказание, а какие нет. Это может помочь повысить производительность модели и улучшить интерпретацию результатов.
4. Оценка модели
Метрики
Обязательно ориентируйтесь на различные метрики оценки, такие как F1-мера, поскольку точность может быть вводящей в заблуждение при работе с несбалансированными классами.
Улучшение отчетности
Ваш код выводит confusion matrix, что является отличным шагом. Используйте эту информацию для анализа, какие классы чаще всего путаются, и решите, как можно улучшить их представление.
Заключение
Итак, чтобы повысить точность ваших предсказаний, стоит рассмотреть улучшение моделей, обработку данных, использование кросс-валидации и оптимизацию алгоритмов. Начните с анализа текущего состояния, используя прокладывающие методы и комбинируйте алгоритмы для достижения лучших результатов. Удачи в вашем медицинском исследовании, и не стесняйтесь экспериментировать с различными настройками!