决策树仅预测一个类

时间:2017-09-30 09:47:10

标签: python machine-learning scikit-learn

我在以下数据集上拟合决策树:

https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data

以下是我的代码:

balance_data=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data",
                           sep= ',', header= None)

le = preprocessing.LabelEncoder()
balance_data = balance_data.apply(le.fit_transform)
X = balance_data.values[:, 0:5]
Y = balance_data.values[:,6]
X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size = 0.2, random_state = 100)

#using Gini index
clf_gini = DecisionTreeClassifier(criterion = "gini", random_state = 100,
                               max_depth=3, min_samples_leaf=5)

clf_gini.fit(X_train, y_train)

#using Information Gain
clf_entropy = DecisionTreeClassifier(criterion = "entropy", random_state = 100,
 max_depth=3, min_samples_leaf=5)
clf_entropy.fit(X_train, y_train)


#Gini prediction
y_pred = clf_gini.predict(X_test)
y_pred

#IG prediction
y_pred_en = clf_entropy.predict(X_test)
y_pred_en

在基尼指数和IG两种情况下,输出如下:

array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,])

训练有问题吗?此外,我如何将此数值转换为字符串值。

Edit1:我计算了准确度,它说71.有可能唯一的问题出在输出显示中吗?

1 个答案:

答案 0 :(得分:4)

您的数据集不平衡

您的数据如下所示:

       0      1  2  3      4     5      6
0  vhigh  vhigh  2  2  small   low  unacc
1  vhigh  vhigh  2  2  small   med  unacc
2  vhigh  vhigh  2  2  small  high  unacc
3  vhigh  vhigh  2  2    med   low  unacc
4  vhigh  vhigh  2  2    med   med  unacc

您的目标变量是第6列Y = balance_data.values[:,6]。 启动新的机器学习项目时,您需要做的主要任务之一是检查数据集是否不平衡,您可以按如下方式执行此操作:

In [46]: balance_data.iloc[:,6].value_counts()
Out[46]: 
unacc    1210
acc       384
good       69
vgood      65
Name: 6, dtype: int64

如您所见,数据集主要包含70.02%的准确度,目标值为unacc的观察值:

In [49]: 1210/1728.
Out[49]: 0.7002314814814815

如您所述,模型的准确率约为71%,相当于整个数据集中目标值unacc的百分比。

有几种方法可以尝试克服这个问题,请查看以下教程以获取详细的教程: