预测哪种药物最适合哪个患者返回的准确度几乎为 0

数据挖掘 分类 scikit-学习
2022-02-28 14:32:05

我有一个看起来像这样的数据框:

data = {'age': [54, 21, 7, 18],
        'sex': [0, 1, 1, 0],
        'disease_type': ['A', 'B', 'A', 'F'],
        'change_in_pain': [-0.54, -0.89, 0.07, -0.01],
        'drug': ['drug_1', 'drug_7', 'drug_1', 'drug_89'],
        }
df = pd.DataFrame(data)

=>

   age  sex disease_type  change_in_pain     drug
0   54    0            A           -0.54   drug_1
1   21    1            B           -0.89   drug_7
2    7    1            A            0.07   drug_1
3   18    0            F           -0.01  drug_19
...

真正的 df 有 > 10000 行(=患者)和 34 种不同的药物,但似乎我不能在这里上传 csv 以获得更有用的示例?

我想训练一个模型,根据患者的年龄、性别、疾病类型以及疼痛减轻的程度(更负的“change_in_pain”列更好),预测哪种药物对哪个患者最有效。

在这个简单的示例中,“drug_1”仅适用于疾病 A 的患者年龄较大且为女性。

我编写了以下代码,但平均精度几乎返回 0 :

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
   

# shuffle
df = df.sample(frac=1.0).reset_index(drop=True)

X = df[['age', 'sex', 'disease_type', 'change_in_pain']]
y = df['drug']

# convert categorical variable into dummy/indicator variables.
X_OHE = pd.get_dummies(X)
y_OHE = pd.get_dummies(y)

X_train, X_test, y_train, y_test = train_test_split(X_OHE, y_OHE, test_size=0.20)

scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

knn = KNeighborsClassifier(5)
knn.fit(X_train, y_train)
score = knn.score(X_test, y_test)
print('mean accuracy: {:2.2f}'.format(score))

我也测试过:RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1), KNeighborsClassifier(3), DecisionTreeClassifier(max_depth=5), MLPClassifier(alpha=1, max_iter=1000)但平均acc再次接近零。

我究竟做错了什么?

编辑:

使用以下方法更慢地执行此操作:

knn.fit(X_train, y_train)  # X_train: 8000x11, y_train: 8000x34
y_pred = clf.predict(X_test)  # X_test: 2000x11, y_pred: 2000x34
acc = accuracy_score(y_test, y_pred)

显示y_pred似乎只包含零 - 但为什么呢?

2个回答

我不能确切地说为什么你会得到空精度,但我有一些评论可能会有所帮助:

  • 您正在混合连续数据和分类数据。您可能已经意识到:
    • 标准化您的数据时:虽然您正在标准化您的分类数据(性别,疾病类型),但请确保它有意义(取决于您使用的分类器)
    • 根据分类器的不同,混合连续数据和二进制数据可能会导致不良结果。这篇文章解释了它的情况KNN

否则,我第一眼看不到任何可疑之处。您能否分享更多数据,以便我们重现您的结果?

您应该可视化您的数据以查看可能适合哪种决策界限。可能没有可以预测药物类型的特征的权重。