Мультиклассовый набор данных с множеством признаков, приводящий к плохой точности предсказаний.

Вопрос или проблема

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...