我有一个看起来像这样的数据框:
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似乎只包含零 - 但为什么呢?