极简sklearn-决策树(二)

前言

上一篇中介绍了决策树模型的基本使用,这篇来讲解下如何调参。

首先我们来谈谈如何提升预测的准确性,

第一步当然是选择正确的模型了,在学习机器学习算法的过程中,我们需要知道每个模型的特点,它擅长什么样的数据集,不擅长什么样的数据集,但有时候我们对数据集的分布并不是很清楚,这个时候就需要一个个尝试了。

第二步就是特征工程,sklearn当中的数据集往往很完美,没有缺失数据,但现实中的数据集有很多的问题,需要对数据做一定的处理才能使用,有些高手甚至能从已有特征中创建出新的特征,特征工程的掌握程度是区别菜鸟与高手的一个重要标志。

第三步就是调参了,其实我们现在数据集确定了,模型确定了,唯一能提升模型效果的就只有调参了,这也是为什么机器学习工程师被称为调参侠的原因 O(∩_∩)O哈哈~

第一个参数,criterion

criterion是用来衡量不纯度的指标,有两个参数可供选择,gini(基尼系数)和entropy(信息增益)

gini是默认参数,它跟entropy相比比较迟钝,所以不容易发生过拟合,在数据集特征多或者噪音多时有更好的表现,大部分情况下用这个

entropy,如果模型拟合度不好,可以试试这个

过拟合与欠拟合

说到调参我们再说说什么是过拟合与欠拟合

简单来说,如果模型在训练集上表现很好,在测试集上表现糟糕就是过拟合,比如在训练集上分数是95,在测试集上只有80分,那明显是过拟合了

如果在训练集和测试集上表现都不好,就是欠拟合了

random_state和splitter

random_state表示决策树随机种子,如果特征很多,决策树不会计算所有特征,而是随机选择一些特征来计算,通过splitter来控制随机策略,best表示优先选择关联度高的特征,random表示完全随机

max_depth

限制树的最大深度,超过设定深度的树枝全部剪掉,用的最广泛的剪枝参数,决策树多生长一层,对样本量的需求会增加一倍,所以限制树的深度能够有效防止过拟合。调参时可以从3开始尝试。

clf = tree.DecisionTreeClassifier(criterion="gini", random_state=20
                                 ,max_depth=3)
clf.fit(xtrain, ytrain)
score = clf.score(xtest, ytest)
print(score)

 可以看到效果立竿见影,分数从之前0.88上升到0.94

min_samples_leaf和min_samples_split

min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分 枝就不会发生或者分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。比如这个值设为5,则发生分枝后叶子节点只有3个样本的方案就不会发生。
一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型变得更加平滑。这个参数的数量设置得太小会引 起过拟合,设置得太大就会阻止模型学习数据。一般来说,建议从=5开始使用。
min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。比如这个值设为5,则一个节点只有4个样本那么这个节点就不会分枝。

学习曲线

如果更直观的调参呢?这时候就可以用到学习曲线了.

#学习曲线
import matplotlib.pyplot as plt
%matplotlib inline

test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(criterion="gini", random_state=20
                                 ,max_depth=i + 1          #z最大深度
                                 ,min_samples_leaf=10  #叶子节点最小样本数
                                 ,min_samples_split=10) #节点允许分枝样本数
    clf = clf.fit(xtrain, ytrain)
    score = clf.score(xtest, ytest)
    test.append(score)
plt.plot(range(1, 11), test, color="red", label="max_depth")
plt.legend()
plt.show()

 可以看到max_depth设为3的时候效果最好,再大对模型提升也没什么效果了

预测结果

clf.predict(xtest) #预测结果

用来预测数据对应的标签

决策树擅长的数据集

决策树擅长月亮型和对半分型数据,不擅长环形数据

最擅长月亮型数据的是最近邻算法,支持向量机和高斯过程

最擅长环形数据的是最近邻算法和高斯过程

最擅长对半分数据的是朴素贝叶斯,神经网络和随机森林

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于Python的文本分类的代码分享,使用了sklearn中的决策树和随机森林算法。 首先,需要安装sklearn库,可以使用以下命令进行安装: ``` pip install -U scikit-learn ``` 然后,导入所需的库和模块: ```python from sklearn.feature_extraction.text import CountVectorizer from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score ``` 接下来,加载数据集并进行数据预处理: ```python # 加载数据集 data = open('data.txt').read() # 分割为文本和类别 text, labels = [], [] for line in data.split('\n'): text.append(line.split('\t')[0]) labels.append(line.split('\t')[1]) # 将文本数据转换为数值特征向量 vectorizer = CountVectorizer() X = vectorizer.fit_transform(text) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42) ``` 然后,使用决策树进行文本分类: ```python # 创建决策树分类器并进行训练 dt_classifier = DecisionTreeClassifier() dt_classifier.fit(X_train, y_train) # 在测试集上进行预测 y_pred_dt = dt_classifier.predict(X_test) # 计算准确率 accuracy_dt = accuracy_score(y_test, y_pred_dt) print("决策树准确率:", accuracy_dt) ``` 最后,使用随机森林进行文本分类: ```python # 创建随机森林分类器并进行训练 rf_classifier = RandomForestClassifier() rf_classifier.fit(X_train, y_train) # 在测试集上进行预测 y_pred_rf = rf_classifier.predict(X_test) # 计算准确率 accuracy_rf = accuracy_score(y_test, y_pred_rf) print("随机森林准确率:", accuracy_rf) ``` 以上就是基于Python的文本分类代码示例,使用了sklearn中的决策树和随机森林算法。可以根据自己的数据集和需求进行相应的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值