信息增益是指在数据集合的经验熵与特征给定条件下的经验条件熵之差。所以信息增益越大的话特征的分类能力就越强。
条件熵的话,是在一直随机变量X的条件下,随机变量Y的不确定性。
信息增益率是用信息增益和属性对应的固有值的比来定义的。
决策树基尼系数(Gini Coefficient)是用于衡量分类树模型性能的指标。基尼指数也被称为不纯度,它用于衡量样本在某个特征上的不平衡程度。它通常应用于决策树模型中,这种模型可以根据特征来预测一个样本,基尼指数可以用来描述一个特征的不平衡度,进而有助于进一步评价模型的表现
基尼系数是用纯度来表示的,直观来说的话就是反映了从数据集中随机抽选两个样本,这两个样本的类别标记不一致的概率,因此值越小相对的纯度就越高,划分节点的话效果就越好。
在决策树中,剪枝分为两种方式:
1.预剪枝过程为:将当前节点标记为叶节点,类别标记为训练样例中最多的类别
2.后剪枝过程为:自底向上,将当前子树节点标记为叶节点,类别标记为训练样例中最多的类别
优点:
1.决策树易于理解和解释,可以可视化分析,容易提取出规则
2.可以同时处理标称型和数值型的数据
3.比较适合处理有缺失属性的样本(因为在构建树(在分裂中)的时候会自动过滤掉)
4.能够处理不相关的特征
5.测试数据集时,运行速度比较快
6.在相对短的时间内能够对大型数据源做出可行且效果良好的结果
缺点:
1.过拟合:决策树容易过拟合训练数据,特别是当树的深度很大或分支较多时。过拟合会导致模型在新数据上表现不佳,因为它过于复杂,过多地记忆了训练数据的噪声。
2.不稳定性:决策树对数据中微小的变化非常敏感。即使数据中存在轻微的变化,决策树的结构可能会发生显著变化,这使得模型不稳定。
3.处理不平衡数据:当数据集中的类别分布不平衡时,决策树容易偏向于占多数的类别,对于少数类别的预测性能较差。需要采取额外的措施来处理不平衡数据。
4.局部最优解:决策树构建时使用贪婪算法,可能导致生成局部最优的树结构,而不一定是全局最优。这可能需要在多个不同的初始条件下训练多个决策树来减轻这一问题。
5.特征连续性处理:决策树通常将特征看作离散值,不擅长处理连续特征。尽管有方法可以将连续特征处理为离散特征,但这增加了复杂性。
6.不足的泛化能力:决策树的泛化能力相对较弱,特别是在高维数据中。它在某些情况下可能无法很好地适应未见数据。
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.metrics import accuracy_score, roc_curve, roc_auc_score
from sklearn.tree import DecisionTreeClassifier
dfs = pd.read_csv(r'E:\PycharmProjects\senior High School Four\day9zy\data\vedio_dataset.csv')
# print(dfs.head(5))
x = dfs.drop(columns=['like', 'duration_time', 'real_time', 'H', 'date'])
y = dfs['like']
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.2, random_state=1)
model = DecisionTreeClassifier(max_depth=3, random_state=2)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
score = accuracy_score(y_pred, y_test)
parameteres = {'max_depth':[1,2,4,5,9],'criterion':['gini','entropy'],'min_samples_split':[2,5,8,9,10]}#min_samples_split:决定了能够继续进行分隔的最少分割样本
grid_search=GridSearchCV(model,parameteres,cv=5)
grid_search.fit(x_train,y_train)
best = grid_search.best_params_
print(best)
de = DecisionTreeClassifier(criterion='gini',max_depth=5,min_samples_split=2)
de.fit(x_train,y_train)
sc = de.score(x_test,y_test)
print(sc)