决策树分类原理
ID3:以信息增益为划分依据;ID3只能对离散属性的数据集构成决策树
C4.5:以信息增益率为划分依据;优化后解决了ID3分⽀过程中总喜欢偏向选择值较多的属性
CART:以Gini系数为划分依据;可以进⾏分类和回归,可以处理离散属性,也可以处理连续属性
CART一定是二叉树
CART剪枝
剪枝是决策树学习算法对付过拟合的主要手段,主动去掉一些分支来降低过拟合的风险
预剪枝
预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点
缺点:会带来欠拟合地风险
后剪枝
后剪枝是指先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点
缺点:生成完全决策树之后对非叶节点进行逐一考察,训练时间开销大
特征工程--特征提取
把任意数据转换为可用于机器学习的数字特征
特征提取api
sklearn.feature_extraction
字典特征提取
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
# 字典特征提取
transfer = DictVectorizer(sparse=False)
new_data = transfer.fit_transform(data)
print(new_data)
names = transfer.get_feature_names_out()
print(names)
if __name__ == '__main__':
dict_demo()
文本特征提取
英文文本特征提取
中文文本特征提取
英文是默认以空格分开的,达到了一个分词效果,所以需要使用jieba对中文进行分词处理
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word(text):
text = " ".join(list(jieba.cut(text)))
return text
def text_chinese_count_demo():
data = ["⼀种还是⼀种今天很残酷,明天更残酷,后天很美好,但绝对⼤部分是死在明天晚上,所以每个⼈不要放弃今天。",
"我们看到的从很远星系来的光是在⼏百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只⽤⼀种⽅式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 将原始数据转换成分好词的形式
text_list = []
for sent in data:
text_list.append(cut_word(sent))
print(text_list)
# 1、实例化⼀个转换器类
# transfer = CountVectorizer(sparse=False)
transfer = CountVectorizer(stop_words=["一种", "今天"]) # 停用词
# 2、调⽤fit_transform
data = transfer.fit_transform(text_list)
print("⽂本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
if __name__ == '__main__':
text_chinese_count_demo()
Tf-idf文本特征提取
主要思想:如果某个词或短语在一篇文章里出现的频率高,并在其他文章里很少出现,则认为该词或短语具有很好的类别区分能力
作用:用以评估一字词对于一个文件集或者一个语料库中的一份文件的重要程度
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def cut_word(text):
text = " ".join(list(jieba.cut(text)))
return text
def tfidf_demo():
data = ["⼀种还是⼀种今天很残酷,明天更残酷,后天很美好,但绝对⼤部分是死在明天晚上,所以每个⼈不要放弃今天。",
"我们看到的从很远星系来的光是在⼏百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只⽤⼀种⽅式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 将原始数据转换成分好词的形式
text_list = []
for sent in data:
text_list.append(cut_word(sent))
print(text_list)
transfer = TfidfVectorizer()
data = transfer.fit_transform(text_list)
print("⽂本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
if __name__ == '__main__':
tfidf_demo()
决策树算法api
案例
import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 1.获取数据
url = "https://hbiostat.org/data/repo/titanic.txt"
titan = pd.read_csv(url)
# 2.数据基本处理
# 2.1 确定特征值,⽬标值
x = titan[["pclass", "age", "sex"]]
y = titan["survived"]
# 2.2 缺失值处理
x['age'].fillna(value=titan["age"].mean(),inplace=True)
# 2.3 数据集划分
x_train, x_test,y_train, y_test = train_test_split(x, y, random_state=22,test_size=0.2)
# 3.特征⼯程(字典特征抽取)
x_train = x_train.to_dict(orient="records")
x_test = x_test.to_dict(orient="records")
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 4.机器学习(决策树)
estimator = DecisionTreeClassifier(max_depth=5)
estimator.fit(x_train, y_train)
# 5.模型评估
y_pre = estimator.predict(x_test)
ret = estimator.score(x_test, y_test)
print(ret)
回归决策树
分类决策树主要用于处理离散性数据;回归决策树主要用于处理连续性数据。
如何选择划分点?
如何决定叶节点的输出值?
分类树中,我们采用信息论中的方法,通过计算选择最佳划分点