在本文中,我们将详细介绍决策树和随机森林模型。此外,我们将展示决策树和随机森林的哪些超参数对其性能有重大影响,使我们能够找到欠拟合和过拟合之间的最佳解决方案。在了解了决策树和随机森林背后的理论之后,我们将使用Scikit-Learn实现它们。1.决策树决策树是预测建模机器学习的重要算法。经典的决策树算法已经存在了几十年,而随机森林等现代变体是最强大的可用技术之一。通常,此类算法称为“决策树”,但在某些平台(如R)上,它们称为CART。CART算法为bagged决策树、随机森林和boosting决策树等重要算法提供了基础。与线性模型不同,决策树是非参数模型:它们不受数学决策函数的控制,也没有权重或截距需要优化。实际上,决策树会根据特征来划分空间。CART模型表示CART模型的表示是一个二叉树。这是算法和数据结构中的二叉树。每个根节点代表一个输入变量(x)和该变量上的一个分割点(假设该变量是数字)。树的叶节点包含一个输出变量(y),用于预测。给定一个新输入,通过从树的根节点开始计算特定输入来遍历树。决策树的一些优点是:易于理解和解释。树木可以被形象化。需要很少的数据准备。处理数字和分类数据的能力。统计测试可用于验证模型。即使生成数据的真实模型以某种方式违反其假设,也能表现良好。决策树的缺点包括:过度拟合。为了避免这个问题,必须采用剪枝、设置叶节点所需的最小样本数或设置树的最大深度等机制。决策树可能不稳定。决策树可用于集成。无法保证返回全局最优决策树。可以在一个集成学习器中训练多棵树如果某些类别占主导地位,则决策树学习器会创建有偏见的树。建议:在拟合之前平衡数据集2.随机森林随机森林是最流行和最强大的机器学习算法之一。它是一种集成机器学习算法,称为BootstrapAggregation或bagging。为了提高决策树的性能,我们可以使用许多具有随机特征样本的树。3.决策树和随机森林在python中的实现我们将使用决策树和随机森林来预测您有价值的员工的流失。将pandas导入为pdimportnumpy作为npimportmatplotlib.pyplot作为pltimportseaborn作为sns%matplotlibinlinesns.set_style("whitegrid")plt.style.use("fivethirtyeight")df=pd.read_csv("WA_Fn-UseC_-HR-Employee-损耗.csv")4.数据处理fromsklearn.preprocessingimportLabelEncoderfromsklearn.model_selectionimporttrain_test_splitdf.drop(['EmployeeCount','EmployeeNumber','Over18','StandardHours'],axis="columns",inplace=True)categorical_col=[]forcolumn在df.columns中:如果df[column].dtype==objectandlen(df[column].unique())<=50:categorical_col.append(column)df['Attrition']=df.Attrition.astype("类别").cat.codescategorical_col.remove('Attrition')label=LabelEncoder()forcolumnincategorical_col:df[column]=label.fit_transform(df[column])X=df.drop('Attrition',axis=1)y=df.AttritionX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)5.应用树和随机森林算法fromsklearn.metricsimportaccuracy_score,confusion_matrix,classification_reportdefprint_score(clf,X_train,y_train,X_test,y_test,train=True):iftrain:pred=clf.predict(X_train)print("训练结果:\n===================================================")print(f"准确度:{accuracy_score(y_train,pred)*100:.2f}%")print("__________________________________________________")print(f"混淆矩阵:\n{confusion_matrix(y_train,pred)}\n")eliftrain==False:pred=clf.predict(X_test)print("测试结果:\n======================================================")print(f"准确度得分:{accuracy_score(y_test,pred)*100:.2f}%")print("______________________________________________")print(f"ConfusionMatrix:\n{confusion_matrix(y_test,pred)}\n")5.1决策树分类器DecisionTreeParameters:criterion:衡量分裂好坏的标准是Gini杂质的“Gini”和信息增益的“熵”。splitter:用于在每个节点选择拆分的策略。支持的策略是“best”来选择最好的拆分,“random”来选择随机拆分。max_depth:树的最大深度。如果没有,扩展节点直到所有叶节点,或者直到所有叶包含小于min_samples_split的样本。min_samples_split:分裂内部节点所需的最小样本数。min_samples_leaf:叶节点上需要的最小样本数。min_weight_fraction_leaf:叶节点上所需的总权重的最小加权分数。当未提供sample_weight时,样本具有相同的权重。max_features:寻找最佳分割时要考虑的特征数量。max_leaf_nodesmax_leaf_nodes:使用max_leaf_nodes以最佳优先方式形成树。最佳节点定义为杂质的相对减少。如果没有,则有无限数量的叶节点。min_impurity_decrease:如果本次分裂导致杂质减少大于或等于该值,则该节点将被分裂。min_impurity_split:提前停止的阈值。如果节点的不纯度高于阈值,则节点被分裂,否则,它是叶子。从sklearn.tree导入DecisionTreeClassifiertree_clf=DecisionTreeClassifier(random_state=42)tree_clf.fit(X_train,y_train)print_score(tree_clf,X_train,y_train,X_test,y_test,train=True)print_score(tree_clf,X_train,y_train_test,X_=False)5.2决策树分类器超参数调整超参数max_depth控制决策树的整体复杂性。此超参数允许在欠拟合和过拟合决策树之间进行权衡。让我们构建一个浅树用于分类和回归,然后构建一个更深的树以查看参数的影响。超参数min_samples_leaf、min_samples_split、max_leaf_nodes或min_implitity_reduce允许在叶子或节点级别应用约束。超参数min_samples_leaf是叶子允许的最小样本数,否则将不会搜索进一步的分裂。这些超参数可以用作max_depth超参数的补充解决方案。fromsklearn.treeimportDecisionTreeClassifierfromsklearn.model_selectionimportGridSearchCVparams={"criterion":("gini","entropy"),"splitter":("best","random"),"max_depth":(list(range(1,20))),"min_samples_split":[2,3,4],"min_samples_leaf":list(range(1,20)),}tree_clf=DecisionTreeClassifier(random_state=42)tree_cv=GridSearchCV(tree_clf,参数,scoring="accuracy",n_jobs=-1,verbose=1,cv=3)tree_cv.fit(X_train,y_train)best_params=tree_cv.best_params_print(f"最佳参数:{best_params})")tree_clf=DecisionTreeClassifier(**best_params)tree_clf.fit(X_train,y_train)print_score(tree_clf,X_train,y_train,X_test,y_test,train=True)print_score(tree_clf,X_train,y_train,X_test,y_test,train=False)5.3树的可视化来自IPython.displayimportImagefromsiximportStringIOfromsklearn.treeimportexport_graphvizimportpydotfeatures=list(df.columns)features.remove("Attrition")dot_data=StringIO()export_graphviz(tree_clf,out_file=dot_data,feature_names=features,filled=True)graph=pydot.graph_from_dot_data(dot_data.getvalue())Image(graph[0].create_png())5.4RandomForest随机森林是一种元估计器,它拟合多个决策树分类器对数据集的不同子样本进行分类,并使用均值来提高预测精度并控制过度拟合随机森林算法参数:n_estimators:树的数量。criterion:衡量分割质量的函数。支持的标准是基尼系数和信息增益的“熵”。max_depth:树的最大深度。如果没有,扩展节点直到所有叶子都是纯的,或者直到所有叶子包含的样本少于min_samples_split。min_samples_split:分裂内部节点所需的最小样本数。min_samples_leaf:一个叶节点需要的最小样本数。min_samples_leaf只考虑任意深度的分割点,如果左右分支各留有至少一个训练样本。这可能具有平滑模型的效果,尤其是在回归中。min_weight_fraction_leaf:叶节点所需的(所有输入样本的)总权重的最小加权分数。当未提供sample_weight时,样本具有相同的权重。max_features:寻找最佳分割时要考虑的特征数量。max_leaf_nodesmax_leaf_nodes:以最佳优先的方式种植一棵树。最佳节点定义为杂质的相对减少。如果None则无限数量的叶节点。min_impurity_decrease:如果分裂导致杂质减少大于或等于这个值,节点将被分裂。min_impurity_split:树提前停止的阈值。如果一个节点的不纯度高于阈值,则该节点将被分裂,否则为叶子。bootstrap:构建树时是否使用bootstrap样本。如果为False,则使用整个数据集来构建每棵树。oob_score:是否使用袋外样本估计泛化精度。从sklearn.ensemble导入RandomForestClassifierrf_clf=RandomForestClassifier(n_estimators=100)rf_clf.fit(X_train,y_train)print_score(rf_clf,X_train,y_train,X_test,y_test,train=True)print_score(rf_clf,X_train,X,y_trainytest,=False)5.5随机森林超参数调整调整随机森林的主要参数是n_estimators参数。一般来说,森林中的树越多,泛化性能越好,但会减慢拟合和预测的时间。我们还可以调整控制森林中每棵树深度的参数。有两个参数非常重要:max_depth和max_leaf_nodes。事实上,max_depth会强制拥有一个更对称的树,而max_leaf_nodes会限制叶节点的最大数量。n_estimators=[100,500,1000,1500]max_features=['auto','sqrt']max_depth=[2,3,5]max_depth。追加(无)min_samples_split=[2,5,10]min_samples_leaf=[1,2,4,10]bootstrap=[True,False]params_grid={'n_estimators':n_estimators,'max_features':max_features,'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf'bootstrap,:bootstrap}rf_clf=RandomForestClassifier(random_state=42)rf_cv=GridSearchCV(rf_clf,params_grid,scoring="f1",cv=3,详细=2,n_jobs=-1)rf_cv.fit(X_train,y_train)best_params=rf_cv。best_params_print(f"最佳参数:{best_params}")rf_clf=RandomForestClassifier(**best_params)rf_clf.fit(X_train,y_train)print_score(rf_clf,X_train,y_train,X_test,y_test,train=True)print_score(rf_clf,X_train,y_train,X_test,y_test,train=False)最后,本文主要讲解以下内容:决策树和随机森林算法以及各个算法的参数。如何调整决策树和随机森林的超参数。您需要在训练前平衡您的数据集。从每个类中抽取相同数量的样本。通过将每个类的样本权重之和(sample_weight)归一化为相同的值。
