没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1
人工智能和机器学习之回归算法:决策树回归:C4.5 算法
详解
1 引言
1.1 决策树回归的概念
决策树回归是一种监督学习算法,用于解决回归问题。它通过构建一棵树
形结构,其中每个内部节点表示一个特征上的判断,每个分支代表一个判断结
果,而每个叶节点则代表一个输出值。决策树回归可以处理非线性关系,且模
型易于理解和解释。
1.2 C4.5 算法的历史与重要性
C4.5 算法是由 Ross Quinlan 在 1993 年提出的,是 ID3 算法的改进版本。
C4.5 算法不仅用于分类,还可以用于回归。它的重要性在于,C4.5 算法能够处
理连续值和缺失值,同时通过剪枝技术减少过拟合,提高模型的泛化能力。
C4.5 算法在数据挖掘和机器学习领域有着广泛的应用,特别是在处理大规模数
据集时,其效率和效果得到了广泛认可。
2 C4.5 算法详解
2.1 信息增益比
C4.5 算法使用信息增益比作为特征选择的依据。信息增益比是信息增益与
特征固有值的比值,它能够更好地反映特征对数据集的分类能力,避免选择具
有大量值的特征。
2.1.1 公式
信息增益比计算公式如下:
G
a
i
n
R
a
t
i
o
(
A
)
=
G
a
i
n
(
A
)
S
p
l
i
t
I
n
f
o
(
A
)
其中,
G
a
i
n
(
A
)
是信息增益,
S
p
l
i
t
I
n
f
o
(
A
)
是特征固有值。
2.1.2 示例代码
假设我们有以下数据集:
年龄
收入
信用等级
购买
青年
低
一般
否
青年
低
一般
否
2
年龄
收入
信用等级
购买
青年
中
一般
是
青年
高
一般
是
青年
高
优秀
是
青年
高
极好
是
中年
低
一般
否
中年
中
一般
是
中年
高
一般
是
中年
高
优秀
是
中年
高
极好
否
老年
低
一般
否
老年
低
优秀
否
老年
中
优秀
是
老年
中
极好
是
老年
高
极好
否
我们可以使用 Python 的 pandas 和 sklearn 库来计算信息增益比:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import mutual_info_score
#
数据集
data = {'年龄': ['青年', '青年', '青年', '青年', '青年', '青年', '中年', '中年', '中年', '中年', '中年', '
老年', '老年', '老年', '老年', '老年'],
'收入': ['低', '低', '中', '高', '高', '高', '低', '中', '高', '高', '高', '低', '低', '中', '中', '高'],
'信用等级': ['一般', '一般', '一般', '一般', '优秀', '极好', '一般', '一般', '一般', '优秀', '极好', '
一般', '优秀', '优秀', '极好', '极好'],
'购买': ['否', '否', '是', '是', '是', '是', '否', '是', '是', '是', '否', '否', '否', '是', '是', '否']}
df = pd.DataFrame(data)
#
将分类变量转换为数值变量
df = pd.get_dummies(df, columns=['年龄', '收入', '信用等级'])
#
特征和目标变量
X = df.drop('购买', axis=1)
y = df['购买']
#
创建决策树分类器
clf = DecisionTreeClassifier(criterion='entropy')
#
计算信息增益
gain_age = mutual_info_score(X['年龄_青年'], y)
gain_income = mutual_info_score(X['收入_低'], y)
gain_credit = mutual_info_score(X['信用等级_一般'], y)
3
#
计算固有值
split_info_age = 0
split_info_income = 0
split_info_credit = 0
#
计算信息增益比
gain_ratio_age = gain_age / split_info_age if split_info_age != 0 else 0
gain_ratio_income = gain_income / split_info_income if split_info_income != 0 else 0
gain_ratio_credit = gain_credit / split_info_credit if split_info_credit != 0 else 0
print(f'年龄的信息增益比: {gain_ratio_age}')
print(f'收入的信息增益比: {gain_ratio_income}')
print(f'信用等级的信息增益比: {gain_ratio_credit}')
注意:上述代码示例中,SplitInfo(A)的计算未直接实现,因为 sklearn 的
mutual_info_score 函数不直接提供固有值的计算。在实际应用中,固有值的计
算需要根据数据集的特征分布来手动实现。
2.2 连续值处理
C4.5 算法能够处理连续值特征,通过将连续值特征离散化,将其转换为分
类特征,从而进行决策树的构建。
2.2.1 示例代码
假设我们有以下包含连续值特征的数据集:
年龄
收入
购买
25
3000
否
25
3000
否
25
5000
是
25
7000
是
25
7000
是
25
8000
是
35
3000
否
35
5000
是
35
7000
是
35
7000
否
35
8000
是
45
3000
否
45
3000
否
45
5000
是
45
5000
是
45
7000
否
我们可以使用 Python 的 pandas 和 sklearn 库来处理连续值特征,并构建决
4
策树:
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import KBinsDiscretizer
#
数据集
data = {'年龄': [25, 25, 25, 25, 25, 25, 35, 35, 35, 35, 35, 45, 45, 45, 45, 45],
'收入': [3000, 3000, 5000, 7000, 7000, 8000, 3000, 5000, 7000, 7000, 8000, 3000, 3000, 500
0, 5000, 7000],
'购买': [0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0]}
df = pd.DataFrame(data)
#
将连续值特征离散化
discretizer = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile')
df['收入'] = discretizer.fit_transform(df[['收入']])
#
特征和目标变量
X = df.drop('购买', axis=1)
y = df['购买']
#
划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#
创建决策树回归器
regressor = DecisionTreeRegressor(criterion='mse')
#
训练模型
regressor.fit(X_train, y_train)
#
预测
y_pred = regressor.predict(X_test)
#
输出预测结果
print(f'预测结果: {y_pred}')
在上述代码示例中,我们使用了 KBinsDiscretizer 来将连续值特征“收入”
离散化为 3 个区间,然后使用决策树回归器 DecisionTreeRegressor 来构建模型
并进行预测。
2.3 缺失值处理
C4.5 算法能够处理缺失值,通过在构建决策树时,对缺失值进行特殊处理,
如使用剩余值的统计信息进行预测。
5
2.3.1 示例代码
假设我们有以下包含缺失值的数据集:
年龄
收入
信用等级
购买
青年
低
一般
否
青年
低
一般
否
青年
中
一般
是
青年
高
一般
是
青年
高
优秀
是
青年
高
极好
是
中年
低
一般
否
中年
中
一般
是
中年
高
一般
是
中年
高
优秀
是
中年
高
极好
否
老年
低
一般
否
老年
低
优秀
否
老年
中
优秀
是
老年
中
极好
是
老年
高
极好
否
我们可以使用 Python 的 pandas 和 sklearn 库来处理缺失值,并构建决策树:
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
#
数据集,假设
“
信用等级
”
有缺失值
data = {'年龄': ['青年', '青年', '青年', '青年', '青年', '青年', '中年', '中年', '中年', '中年', '中年', '
老年', '老年', '老年', '老年', '老年'],
'收入': ['低', '低', '中', '高', '高', '高', '低', '中', '高', '高', '高', '低', '低', '中', '中', '高'],
'信用等级': ['一般', '一般', '一般', '一般', '优秀', '极好', '一般', '一般', '一般', '优秀', None, '
一般', '优秀', '优秀', '极好', '极好'],
'购买': [0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0]}
df = pd.DataFrame(data)
#
将分类变量转换为数值变量
df = pd.get_dummies(df, columns=['年龄', '收入'])
#
处理缺失值
imputer = SimpleImputer(strategy='most_frequent')
df['信用等级'] = imputer.fit_transform(df[['信用等级']])
#
特征和目标变量
剩余21页未读,继续阅读
资源评论
kkchenjj
- 粉丝: 2w+
- 资源: 5480
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功