公益广告不浪费水网站怎么做网络营销的工作岗位有哪些
公益广告不浪费水网站怎么做,网络营销的工作岗位有哪些,有了云服务器怎么做网站,网站制作建设怎么收费目录 一、导入库、数据集、并划分训练集和测试集
二、参数调优
(一)第一种调参方法#xff1a;for循环
(1)单参数优化
①单参数优化(无K折交叉验证)
②单参数K折交叉验证 优化
(2)多参数优化
①多参数优化(无K折交叉验证)
参数介绍#xff1a;
②多参数K折交叉验证…目录 一、导入库、数据集、并划分训练集和测试集
二、参数调优
(一)第一种调参方法for循环
(1)单参数优化
①单参数优化(无K折交叉验证)
②单参数K折交叉验证 优化
(2)多参数优化
①多参数优化(无K折交叉验证)
参数介绍
②多参数K折交叉验证 优化 (二)第二种调参方法网格搜索法
(1)单参数调参
①单参数优化(无K折交叉验证)
②单参数K折交叉验证 优化
(2)多参数调参
①多参数优化(无K折交叉验证)
②多参数K折交叉验证 优化 总结 三、构建决策树模型并预测
(一)构建模型
(二) 预测测试集返回每个测试样本的分类/回归结果predict (三)决策树模型在测试集上的预测分数/准确率
① clf.score(X_test, y_test) ②accuracy_score(y_pred,y_test) 两种方法分析
(四)查看特征重要性feature_importances_
(五)预测各个类别的概率 (六)计算混淆矩阵
(七) 生成决策树模型的性能报告-classification_report 函数
(八)画出决策树
(1)程序中直接画出决策树
(2)将画出的决策树保存为pdf格式
(3)将画出的决策树保存为png格式
(九) 查看叶子节点数量
(十) 返回每个测试样本所在叶子节点的索引apply
补充 一、导入库、数据集、并划分训练集和测试集
# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier# 导入鸢尾花数据集
iris load_iris()
X iris.data # 特征
y iris.target # 类别
feature_names iris.feature_names # 特征名称
class_names iris.target_names # 类别名称# 将数据集划分为训练集和测试集比例为 6:4
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.4, random_state30)
二、参数调优
这一部分介绍两种方法进行最优参数的选择
第一种方法时通过for循环
第二种方法是网格调参
两种方法本质上是一样的
同时每种方法下又详细介绍了如何对单参数调参和多参数同时调参
此外呢又介绍了怎么结合K折交叉验证进行参数的选择
(一)第一种调参方法for循环
(1)单参数优化
①单参数优化(无K折交叉验证)
下边是对一个参数即max_depth决策树的最大深度进行最优参数选择
# 建模训练
score_list1[]
for i in np.arange(2, 6, 1):clf DecisionTreeClassifier(criterionentropy, max_depthi, min_samples_split2, min_samples_leaf2,random_state0)clf clf.fit(X_train, y_train)score clf.score(X_test, y_test)score_list1.append(score) # 保存得分
# 绘制得分
plt.plot(np.arange(2, 6), score_list1, colorred)
plt.xticks(np.arange(2, 6, 1)) # 设置横坐标刻度为整数
plt.show()
结果如下x轴代表最大深度max_depth的取值纵轴代表各个最大深度下模型在测试集上对应的准确率 。结果表明最大深度在2或者3时模型准确率达到最大之后决策树的最大深度增加模型的准确率会下降图中深度为4或者5模型的准确率持平。
这里只是示例可以选择其他最大深度进行验证。 ②单参数K折交叉验证 优化
首先导入了KFold然后创建了一个五折交叉验证的实例。
在循环中我们使用kf.split()来获取训练集和测试集的索引然后根据这些索引划分数据集。接下来我们使用训练集拟合模型并在测试集上计算得分。
最后我们将每次迭代的得分求平均并添加到score_list1中
from sklearn.model_selection import KFold
import numpy as np
from sklearn.tree import DecisionTreeClassifierscore_list1 []
kf KFold(n_splits5, shuffleTrue, random_state0)for i in np.arange(2, 6, 1):clf DecisionTreeClassifier(criterionentropy, max_depthi, min_samples_split2, min_samples_leaf2, random_state0)scores []for train_index, test_index in kf.split(X_train):X_train_fold, X_test_fold X_train[train_index], X_train[test_index]y_train_fold, y_test_fold y_train[train_index], y_train[test_index]clf.fit(X_train_fold, y_train_fold)score clf.score(X_test_fold, y_test_fold)scores.append(score)score_list1.append(np.mean(scores))
# 绘制得分
plt.plot(np.arange(2, 6), score_list1, colorred)
plt.xticks(np.arange(2, 6, 1)) # 设置横坐标刻度为整数
plt.show()
结果如下发现最大深度在2、3、4、5时模型的准确率相同。 当不同深度的决策树模型在特定评估指标如准确率上表现相同时我们可以参考以下几个方面来选择决策树的最大深度
模型复杂度与过拟合风险、可解释性、计算资源和效率集成方法、业务需求和应用场景等一般情况下如果准确率相同倾向于选择深度较小的决策树因为它往往具有更好的泛化能力和较低的复杂度。但如果在其他重要指标上有显著差异也应该考虑这些因素的影响。
当然面对具体情况时即使不同深度的决策树模型在准确率上表现出相同的水平选择最合适的最大深度仍需细致考量。例如当最大深度从3层增加到4层时尽管准确率不变但若4层决策树能揭示更多关于数据潜在规律的有价值信息或者有助于提升模型的可解释性和完整性那么在这种情况下选择4层深度的决策树可能更为合适。
(2)多参数优化
①多参数优化(无K折交叉验证)
# 初始化变量
max_score -np.inf # 初始化最大得分为负无穷大
best_params_history [] # 初始化历史最佳参数列表
score_list []# 建模训练
for i in np.arange(2, 6, 1):for j in np.arange(2, 10, 2):for t in np.arange(2, 10, 2):clf DecisionTreeClassifier(criterionentropy, max_depthi, min_samples_splitj, min_samples_leaft, random_state0)clf clf.fit(X_train, y_train)score clf.score(X_test, y_test)score_list.append(score) # 保存得分# 检查当前得分是否等于最大得分if score max_score: # 使用 而不是 这样当得分相同时也会记录max_score score # 更新最大得分best_params_history.append((i, j, t)) # 添加当前最优参数到历史最优参数列表# 展示结果
print(All best parameters sets when the max score was achieved:)
for params in best_params_history:print(fi{params[0]}, j{params[1]}, t{params[2]})print(fMax score: {max_score})# 绘制得分
plt.plot(np.arange(1, len(score_list) 1), score_list, colorred)
plt.show()
参数介绍
本章节中主要采用了前三个参数的调参。 max_depth: 决策树的最大深度用于控制树的复杂度。限制树的深度可以防止过拟合因为它限制了树可以学习的规则的数量。 min_samples_split: 节点分裂的最小样本数。决策树在节点分裂时会考虑这个参数如果节点的样本数少于这个值则不会继续分裂。 min_samples_leaf: 叶节点的最小样本数。在叶节点分裂时如果分裂后每个子节点的样本数少于这个值则不会继续分裂从而控制了叶节点的大小。 min_impurity_decrease 是决策树算法中的一个重要参数主要用于控制决策树的增长过程防止过拟合。当算法在构建决策树时会尝试在每个内部节点划分数据集以期降低决策树的不纯度对于分类问题是基尼不纯度或信息熵对于回归问题是均方误差。min_impurity_decrease 参数规定了一个阈值要求在进行节点划分时至少能带来这么大的不纯度下降量。也就是说只有当划分后的子节点相较于父节点的不纯度减少量大于等于 min_impurity_decrease 所设定的阈值时才会继续划分该节点。 如果当前节点划分后所有可能的子节点不纯度减小量都不满足此条件则该节点会被标记为叶子节点不再向下生长。 通过设置合适的 min_impurity_decrease 参数可以限制决策树的精细化程度有利于防止过拟合提高模型的泛化能力。 max_features 用来控制在构建决策树时每个节点分裂时考虑的最大特征数。 当你设置 max_features3这意味着在决策树进行节点划分时每次都将从所有特征中最多随机选择3个特征来评估最佳分割点。换句话说在确定每个内部节点如何划分数据集时算法只会考虑最多3个特征作为候选特征从中选取信息增益或者其他衡量标准如基尼不纯度最高的那个特征进行分割。这个参数有助于防止过拟合尤其是在特征数量较多的情况下通过限制决策树对特征的选择范围能够构建出更为泛化的模型。 max_leaf_nodes是决策树算法中的一个参数用于指定最大叶子节点数。通过限制最大叶子节点数可以控制决策树的复杂度进而防止过拟合。当设置了max_leaf_nodes参数时算法会在构建树的过程中尝试保持叶子节点数不超过指定值。
这些参数可以帮助控制决策树的生长过程防止过拟合并提高模型的泛化能力。
综上所示六个剪枝参数 决策树可以很好地处理分类问题但常会由于节点数过多致使过拟合问题的出现于是出现了控制预剪枝、后剪枝等的剪枝参数这也是决策树算法实现过程中需要调节的很重要的参数。
max_depth: 控制最大深度
min_samples_leaf: 限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本否则分枝就不会发生或者分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
min_samples_split: 限定一个节点必须要包含至少min_samples_split个训练样本这个节点才允许被分枝否则分枝就不会发生
max_features用暴力方法限制特征数量相较而言要通过减少特征数量来防止过拟合的话用PCA、随机森林等降维和特征选择方法更好
min_impurity_decrease限制信息增益的大小信息增益小于设定数值的分枝不会发生
max_leaf_nodes是决策树算法中的一个参数用于指定最大叶子节点数。
结果如下
结果给出了每次取得最大分数时对应的参数值的选取并且给出了最大分数。
以及每组参数选择对应的分数图。 ②多参数K折交叉验证 优化
# 初始化变量
max_score -np.inf # 初始化最大得分为负无穷大
best_params_history [] # 初始化历史最佳参数列表
score_list []# 建模训练
for i in np.arange(2, 6, 1):for j in np.arange(2, 10, 2):for t in np.arange(2, 10, 2):clf DecisionTreeClassifier(criterionentropy, max_depthi, min_samples_splitj, min_samples_leaft, random_state0)scores []for train_index, test_index in kf.split(X_train):X_train_fold, X_test_fold X_train[train_index], X_train[test_index]y_train_fold, y_test_fold y_train[train_index], y_train[test_index]clf.fit(X_train_fold, y_train_fold)score clf.score(X_test_fold, y_test_fold)scores.append(score)scorenp.mean(scores)score_list.append(np.mean(scores))# 检查当前得分是否等于最大得分if score max_score: # 使用 而不是 这样当得分相同时也会记录max_score score # 更新最大得分best_params_history.append((i, j, t)) # 添加当前最优参数到历史最优参数列表# 展示结果
print(All best parameters sets when the max score was achieved:)
for params in best_params_history:print(fi{params[0]}, j{params[1]}, t{params[2]})print(fMax score: {max_score})# 绘制得分
plt.plot(np.arange(1, len(score_list) 1), score_list, colorred)
plt.show() (二)第二种调参方法网格搜索法
(1)单参数调参
①单参数优化(无K折交叉验证)
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
kf KFold(n_splits5, shuffleTrue, random_state0)
parameters{max_depth:[1,2,3,4,5,6]}
clfDecisionTreeClassifier()
grid_searchGridSearchCV(clf,parameters)#传入训练集数据并开始进行参数调优
grid_search.fit(X_train,y_train)
grid_search.best_params_
print(最优参数: , grid_search.best_params_)
print(最优得分: , grid_search.best_score_) ②单参数K折交叉验证 优化
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
kf KFold(n_splits5, shuffleTrue, random_state0)
parameters{max_depth:[1,2,3,4,5,6]}
clfDecisionTreeClassifier()
grid_searchGridSearchCV(clf,parameters,cvkf)#传入训练集数据并开始进行参数调优
grid_search.fit(X_train,y_train)
grid_search.best_params_
print(最优参数: , grid_search.best_params_)
print(最优得分: , grid_search.best_score_) (2)多参数调参
①多参数优化(无K折交叉验证)
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
kf KFold(n_splits5, shuffleTrue, random_state0)
parameters{max_depth:[1,2,3,4,5,6],criterion:[gini,entropy],min_samples_split:[2,3,4,5,6,7,8,9]}
clfDecisionTreeClassifier()
grid_searchGridSearchCV(clf,parameters)#传入训练集数据并开始进行参数调优
grid_search.fit(X_train,y_train)
grid_search.best_params_
print(最优参数: , grid_search.best_params_)
print(最优得分: , grid_search.best_score_) ②多参数K折交叉验证 优化
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
kf KFold(n_splits5, shuffleTrue, random_state0)
parameters{max_depth:[1,2,3,4,5,6],criterion:[gini,entropy],min_samples_split:[2,3,4,5,6,7,8,9]}
clfDecisionTreeClassifier()
grid_searchGridSearchCV(clf,parameters,cvkf)#传入训练集数据并开始进行参数调优
grid_search.fit(X_train,y_train)
grid_search.best_params_
print(最优参数: , grid_search.best_params_)
print(最优得分: , grid_search.best_score_) 总结
在进行参数调优时确实需要注意到两个重要的方面即多参数调优和单参数调优的区别以及参数范围的选择问题。为了更加严谨地进行模型调优可以采取以下优化措施
1. 多参数调优 vs. 单参数调优 * 对于需要调整多个参数的情况推荐使用多参数调优方法如GridSearchCV()或RandomizedSearchCV()以全面考虑不同参数组合对模型性能的影响。 * 对于单一参数的调优确实可以采用单参数调优的方式但需要注意单参数调优可能会忽略到多个参数之间的交互影响因此在选择调优方法时应根据具体情况进行权衡。
2. 参数范围的选择 * 在使用GridSearchCV()等函数进行参数调优时如果得到的最优值位于参数范围的边界值有可能存在更优的参数取值此时需要考虑扩大参数搜索范围。 * 为了更全面地搜索参数空间可以根据实际情况逐步扩大参数范围以确保找到模型性能的最优组合。 总的来说在进行模型参数调优时应当充分考虑参数之间的交互影响选择适当的调优方法并不断优化参数范围以获得更好的模型性能。这样可以确保模型在拟合和泛化能力上都达到较好的平衡提高模型的预测准确性。 三、构建决策树模型并预测
前边我们介绍了如何选取最优参数假如我们得到的最优参数是max_depth2, min_samples_split2, min_samples_leaf2
(一)构建模型
clf DecisionTreeClassifier(criterionentropy, max_depth2, min_samples_split2, min_samples_leaf2,random_state0)
clf clf.fit(X_train, y_train)
(二) 预测测试集返回每个测试样本的分类/回归结果predict
clf.predict(X_test) y_predclf.predict(X_test)
apd.DataFrame()
a[预测值]y_pred
a[真实值]y_test
a[:5] 前五行数据如下 (三)决策树模型在测试集上的预测分数/准确率
① clf.score(X_test, y_test)
score clf.score(X_test, y_test)
score ②accuracy_score(y_pred,y_test)
from sklearn.metrics import accuracy_score
accuracyaccuracy_score(y_pred,y_test)
accuracy 两种方法分析
accuracy_score和clf.score都是用来评估分类模型的性能指标但它们之间有一些区别。
accuracy_score(y_pred, y_test)这个函数计算的是模型在测试集上的准确率即正确预测的样本数占总样本数的比例。其中y_pred是模型在测试集上的预测结果y_test是测试集的真实标签。
clf.score(X_test, y_test)这个方法是scikit-learn中分类器对象的方法用于计算模型在测试集上的准确率。它会自动使用模型对测试集进行预测并将预测结果与真实标签进行比较从而得到准确率。
总的来说这两种方法都可以用来评估分类模型在测试集上的表现但accuracy_score需要手动传入预测结果而clf.score则直接使用分类器对象对测试集进行预测。两者得到的准确率值应该是一致的只是计算方式略有不同。
(四)查看特征重要性feature_importances_
clf.feature_importances_ [*zip(feature_names,clf.feature_importances_)] # 如果特征变量很多可以使用如下代码将特征名称和特征重要性一一对应以方便查看
featuresiris.feature_names # 特征名称
importancesclf.feature_importances_
dfpd.DataFrame()
df[特征名称]features
df[特征重要性]importances
df.sort_values(特征重要性,ascendingFalse) (五)预测各个类别的概率
y_pred_probaclf.predict_proba(X_test)#是一个三维数组
bpd.DataFrame(y_pred_proba,columns[0类概率,1类概率,2类概率])
b[:5]
前五行数据如下 在决策树中clf.predict_proba 方法用于获取样本在每个类别上的概率预测。决策树模型在预测样本属于每个类别的概率时通常采用以下原理进行计算 叶子节点中样本的类别比例在决策树的训练过程中每个叶子节点会包含一定数量的训练样本。当进行预测时样本通过决策树的分支最终到达一个叶子节点。在叶子节点中可以统计该节点中各个类别样本的比例。 类别概率的计算对于一个给定的测试样本通过决策树的遍历找到其所在的叶子节点。然后可以根据该叶子节点中各个类别样本的比例来计算该样本属于每个类别的概率。通常采用的方法是将该叶子节点中每个类别的样本比例作为该样本属于该类别的概率。 归一化最后为了确保每个类别的概率值在 0 到 1 之间并且所有类别的概率之和为 1通常会对概率值进行归一化处理例如采用 softmax 函数。
总的来说clf.predict_proba 方法在决策树中是基于叶子节点中样本的类别比例来计算样本属于每个类别的概率。这种方法简单直观同时也能提供对样本属于不同类别的置信度信息。 (六)计算混淆矩阵
table pd.crosstab(y_test, y_pred, rownames[Actual], colnames[Predicted])
table from sklearn.metrics import confusion_matrix
cm confusion_matrix(y_test, y_pred)
cm from sklearn import metrics
metrics.plot_confusion_matrix(clf, X_test, y_test)
plt.show() (七) 生成决策树模型的性能报告-classification_report 函数
from sklearn.metrics import classification_report
# 输出评估指标
print(classification_report(y_test, y_pred)) ①精确度Precision针对每个类别精确度表示被分类器正确分类的样本数占该类别所有被分类为该类别的样本数的比例。精确度越高分类器将正类别的样本正确地分类为正类别的能力越强。
②召回率Recall针对每个类别召回率表示被分类器正确分类的样本数占该类别所有实际正样本数的比例。召回率越高分类器将正类别的样本正确地识别为正类别的能力越强。
③F1 值精确度和召回率的加权平均值是精确度和召回率的调和平均值。它提供了一个综合性能指标对分类器的整体性能进行评估。
④支持数Support每个类别在测试集中的样本数量。
⑤加权平均值报告的最后一行显示了各项指标的加权平均值其中包括精确度、召回率和 F1 值。这些加权平均值对应于各个类别样本的比例。
在分析这些结果时您可以关注以下几点
对于哪些类别模型的性能较好哪些类别的性能较差 模型的整体性能如何F1 值较高通常表示模型具有较好的平衡性能。 是否有任何类别存在偏差例如某些类别的召回率较低可能意味着模型对于这些类别的识别能力较弱。
(八)画出决策树
(1)程序中直接画出决策树
画决策树需要用到 tree.export_graphviz 函数在 tree.export_graphviz 函数中class_names 参数用于指定分类目标变量类标签的名字这些名字将会显示在决策树图中的叶节点上。该参数的具体值应该是一个列表或者数组其元素顺序与模型所预测的类别顺序保持一致。
这里class_names 列表中的第一个元素对应于模型类别序号 0第二个对应于类别序号 1。
在已经训练好的 scikit-learn 分类器 clf 中类别顺序可以通过访问 clf.classes_ 获取。
clf.classes_
# 因此正确设置 class_names 的方法可能是这样的
#class_names list(clf.classes_) 类别标签需要是字符串类 #类别标签需要是字符串类
class_labels clf.classes_.tolist() # 将numpy数组转换为Python列表
class_names [str(label) for label in class_labels]
import graphviz
plt.rcParams[font.sans-serif] [SimHei]dot_data tree.export_graphviz(clf,out_file None, feature_names feature_names, class_namesclass_names, filledTrue, roundedTrue)
dot_datadot_data.replace(helvetica, SimHei)
graph graphviz.Source(dot_data) graph (2)将画出的决策树保存为pdf格式
graph.render(decision_tree) # 保存为 decision_tree.pdf 文件 (3)将画出的决策树保存为png格式
graph.format png # 指定保存为 PNG 格式
graph.render(decision_tree_image) # 保存为 decision_tree_image.png 文件 (九) 查看叶子节点数量
n_leaves clf.tree_.n_leaves
print(Number of leaves in the decision tree:, n_leaves) (十) 返回每个测试样本所在叶子节点的索引apply
clf.apply(X_test)
#clf.apply(X_test)可以帮助我们理解测试数据集中的样本在训练好的分类器中的位置从而进行更深入的分析和应用 补充
①如果你想基于信息增益或者基尼指数来设定一个硬性阈值若小于某一个阈值则决策树不再向下分裂在sklearn中直接通过参数设置并不支持。若想实现类似效果可能需要自定义决策树算法或在模型建立后进行后处理。 ②预剪枝和后剪枝是决策树中常用的剪枝方法它们旨在优化决策树模型使其具有更好的拟合和泛化能力。下面我对它们进行进一步优化以使得描述更加清晰 预剪枝在构造决策树的过程中对每个节点在进行划分之前进行评估。如果当前节点的划分不能提高泛化能力就停止划分将当前节点标记为叶节点。这种方法的优点是可以在树的生长过程中就尽量减少过拟合但是可能会导致决策树过于简单无法充分表达数据的复杂关系。 后剪枝首先生成一颗完整的决策树然后自底向上地对内部节点进行考察。如果将某个内部节点变为叶节点可以提升整体泛化性能则执行此替换。后剪枝相比于预剪枝来说更加灵活因为它在决策树构造完成之后才进行剪枝可以更充分地利用数据信息但相应的计算成本较高。在商业实战中前剪枝应用得更广泛参数调优其实也起到了一定的前剪枝作用。
总结来说预剪枝是一种边构造边剪枝的方法而后剪枝则是在构造完整棵树之后再进行剪枝。选择哪种方法取决于具体情况预剪枝适用于数据量较大的情况下能够在早期防止过拟合而后剪枝则适用于需要更好泛化能力的情况下但会相对耗费更多计算资源。
在商业实战中前剪枝应用得更广泛参数调优其实也起到了一定的前剪枝作用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85216.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!