gpt4 book ai didi

python - 决策树太大 Scikit Learn

转载 作者:行者123 更新时间:2023-11-30 08:56:19 24 4
gpt4 key购买 nike

我有一个包含 1025 个输入和 14 列的数据。首先,我通过将它们放在单独的表中来设置标签。

x = dataset.drop('label', axis=1)
y = dataset['label']

标签值只有 1 或 0。然后我使用以下方法分割数据:

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.30)

然后我制作我的分类器:

from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier()
classifier.fit(X_train, y_train)

然后每当我制作决策树时,它都会变得太大:

from sklearn import tree
tree.plot_tree(classifier.fit(X_train, y_train))

结果输出 8 个级别,并且变得太大了。我认为这没问题,但在观察混淆矩阵和分类报告后:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

其结果是:

[[155   3]
[ 3 147]]
precision recall f1-score support
0 0.98 0.98 0.98 158
1 0.98 0.98 0.98 150

accuracy 0.98 308
macro avg 0.98 0.98 0.98 308
weighted avg 0.98 0.98 0.98 308

高精度让我怀疑我的解决方案。我的代码有什么问题,如何降低决策树和准确性分数?

最佳答案

看起来您需要做的是检查以确保您的树没有过度拟合。使用决策树和 sklearn,我们可以通过两种主要方法来实现这一目标。

验证曲线

首先,您应该检查以确保您的树过度拟合。您可以使用验证曲线 ( see here ) 来做到这一点。

验证曲线的示例如下:

import numpy as np
from sklearn.model_selection import validation_curve
from sklearn.datasets import load_iris
from sklearn.linear_model import Ridge

np.random.seed(0)
X, y = load_iris(return_X_y=True)
indices = np.arange(y.shape[0])
np.random.shuffle(indices)
X, y = X[indices], y[indices]

train_scores, valid_scores = validation_curve(Ridge(), X, y, "alpha",
np.logspace(-7, 3, 3),
cv=5)
train_scores



valid_scores

一旦您确认您的树过度拟合,您需要执行名为 pruning 的操作,您可以使用 @e-zeytinci 提到的超参数优化来完成。您可以使用 GridSearchCV 来做到这一点

GridSearchCV

GridSearchCV 允许我们优化决策树或任何模型的超参数,以查看最大深度和最大节点等内容(这似乎是 OP 关注的问题),并且还帮助我们完成适当的修剪。

An example of that implementation can be read here

取自 this post 的工作代码示例集如下:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV

def dtree_grid_search(X,y,nfolds):
#create a dictionary of all values we want to test
param_grid = { 'criterion':['gini','entropy'],'max_depth': np.arange(3, 15)}
# decision tree model
dtree_model=DecisionTreeClassifier()
#use gridsearch to test all values
dtree_gscv = GridSearchCV(dtree_model, param_grid, cv=nfolds)
#fit model to data
dtree_gscv.fit(X, y)
return dtree_gscv.best_params_

随机森林

或者,Random Forests can help with Decision Tree overfitting .

您可以实现 RandomForestClassifier并遵循上面概述的相同超参数调整。

来自 this post 的示例如下:

from sklearn.grid_search import GridSearchCV
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000,
n_features=10,
n_informative=3,
n_redundant=0,
n_repeated=0,
n_classes=2,
random_state=0,
shuffle=False)


rfc = RandomForestClassifier(n_jobs=-1,max_features= 'sqrt' ,n_estimators=50, oob_score = True)

param_grid = {
'n_estimators': [200, 700],
'max_features': ['auto', 'sqrt', 'log2']
}

CV_rfc = GridSearchCV(estimator=rfc, param_grid=param_grid, cv= 5)
CV_rfc.fit(X, y)
print CV_rfc.best_params_

关于python - 决策树太大 Scikit Learn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59306728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com