【发布时间】:2020-03-19 18:00:57
【问题描述】:
我正在尝试在我的第一个 ML 项目中使用 scikit-learn,将其 DecisionTreeClassifier 与包含数字和分类特征的数据样本一起使用,例如:['High', 33, '不',4]。
我已经到了能够做到的地步。
-
从 .csv 文件中读取训练和测试数据。
physio = pd.read_csv('data.csv', header=None, names=['HR', 'M', 'T', 'W', 'D']) -
提取目标类:
labels = physio.pop('D') -
使用
pandas.get_dummies对分类特征进行一次热编码。这也将特征数量从 4 个增加到 6 个(因为 'HR' 和 'T' 分别变为 'HR_High'/'HR_Low' 和 'T_Yes'/'T_No')for col in physio.dtypes[physio.dtypes == 'object'].index: for_dummy = physio.pop(col) physio = pd.concat([physio, pd.get_dummies(for_dummy, prefix=col)], axis=1) -
将集合拆分为训练和测试子集。
x_train, x_test, y_train, y_test = train_test_split(physio, labels, test_size=0.25) -
实例化并拟合树
dt = DecisionTreeClassifier(max_depth=8, min_samples_split=.3, min_samples_leaf=.26, max_features=4) dt.fit(x_train, y_train) -
在第一次测试拆分中对测试集进行分类
y_pred = dt.predict(x_test) -
并使用
y_test和y_pred使用混淆矩阵(也是ROC的AUC)评估分类conf_matrix = confusion_matrix(y_true=y_test, y_pred=y_pred, labels=['Yes', 'No'])
如果我使用了错误的术语,我很抱歉,但是,现在我正在尝试做这一切应该做的事情,即对传入的数据进行分类,不幸的是,这是我见过的所有教程的落脚点简而言之,一旦所有拆分、训练和测试都发生了,他们就永远不会进入对新数据进行分类的程序部分。
我天真地尝试过的方式:
-
由于实际数据将来自命令行参数,我想我会将它们存储在一个数组中并将其传递给 DataFrame。
newSample = [['Low', 2, 'No', 8]] newSampleDF = pd.DataFrame(newSample, columns=['HR', 'M', 'T', 'W']) -
然后我尝试对其进行单热编码。这就是问题出现的地方,因为在编码完成后,仍然有 4 个特征,因为只是一个数据样本,它对“高”和“是”一无所知,所以“HR”和“T”就变成了“ HR_Low' 和 'T_No' 分别
for col in newSampleDF.dtypes[newSampleDF.dtypes == 'object'].index: for_dummy = newSampleDF.pop(col) newSampleDF = pd.concat([newSampleDF, pd.get_dummies(for_dummy, prefix=col)], axis=1)
当我打印 newSampleDF 时,它显示:
M W HR_Low T_No
2 8 1 1
而我试图对其进行分类的数据的形式是
M W HR_High HR_Low T_No T_Yes
12 48 0 1 0 1
这就是我收到错误的原因:
ValueError:模型的特征数量必须与输入匹配。模型 n_features 为 6,输入 n_features 为 4
这是不言自明的,我只是不知道如何解决它。如何让我的新数据以意识到缺失值的方式编码,在这种情况下为“高”和“是”。
我希望我是有道理的,请随时指出错误和改进,但请记住,第一次来这里。
谢谢
【问题讨论】:
标签: scikit-learn python-3.7 decision-tree one-hot-encoding