我正在进行一个项目,将总统辩论的推文分类为每个候选人的中性、积极和消极类别。(不是当前的辩论数据集)。我使用决策树
、决策树集成
和AdaBoost
进行训练。问题是我得到了100%的准确率,这非常奇怪且不可能。
我使用的是词袋
模型形式的数据。词汇表中的每个词根据是否出现在每条推文中,用0/1表示。我在问题末尾附上了统计数据。df_obama
是一个包含所有关于奥巴马的推文的数据框架。
df_Obama = pd.DataFrame.from_csv("../data/Obama_BagOfWords.csv")df_Obama = df_Obama.reindex(np.random.permutation(df_Obama.index)).reset_index()dataFeatures = df_Obama[allAttribs_Obama]targetVar = list(df_Obama['Class'])splitRatio = 0.9splitPoint = int(splitRatio*len(dataFeatures))dataFeatures_train = dataFeatures[:splitPoint]dataFeatures_test = dataFeatures[splitPoint:]targetVar_train = targetVar[:splitPoint]targetVar_test = targetVar[splitPoint:]clfObj = tree.DecisionTreeClassifier()clfObj.fit(dataFeatures_train,targetVar_train)preds = list(clfObj.predict(dataFeatures_test))accScore = accuracy_score(targetVar_test,preds)labels = [1,-1,0]precision = precision_score(targetVar_test,preds,average=None,labels=labels)recall = recall_score(targetVar_test,preds,average=None,labels=labels)f1Score = f1_score(targetVar_test,preds,average=None,labels=labels)print("Overall Acurracy",accScore)print("precision",precision)print("recall",recall)print("f1Score",f1Score)Overall Acurracy 1.0precision [ 1. 1. 1.]recall [ 1. 1. 1.]f1Score [ 1. 1. 1.]
我实在无法理解为什么会这样?为什么这些指标如此之高? 我还尝试了不同的训练-测试分割比例,结果似乎没有变化。
注意:这是数据信息:
df_Obama.info()<class 'pandas.core.frame.DataFrame'>RangeIndex: 5465 entries, 0 to 5464Columns: 13078 entries, level_0 to zzzzzzzzzzdtypes: int64(13078)memory usage: 545.3 MBdf_Obama.head(3)0023Washington 08hayabusa 09Its .... 09what 1000000th 0 1 0 1 01 0 0 0 00 0 0 0 0
回答:
分类器是否能看到目标值?df_Obama['Class']
是否包含在特征数组中?这一点不清楚,因为你没有展示allAttribs_Obama
的值。
另外,请查看scikit-learn关于决策树的文档,特别是:
“决策树在特征数量大的数据上容易过拟合。”
你可能需要尝试减少特征空间(查看scikit-learn的特征选择文档)。
顺便提一下,你可以使用sklearn.model_selection.train_test_split
来创建训练和测试集。