分类算法:决策树与随机森林
(一)决策树:
决策树思想的来源:程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
先学知识:信息论基础
信息熵:
H = -(p1logp1 + p2logp2 + ... + p32log32)
p1 `````p32 是指的概率
比如A班对B班,胜率一个为x,另一个为1-x
则信息熵为 -(xlogx + (1-x)log(1-x))
信息熵越大,不确定性越高。
反之则越小。
正式开始:
决策树的划分依据之一--- 信息熵(划分:就是那个是最重要的条件,那个次之,依次进行)
结果:
信息熵增益最大的作为树分支结构的首要分类,一次进行重要性的递减操作。
常见的决策树使用的算法:
信息增益 最大的准则
信息增益比 最大的准则
回归树: 平方误差 最小
分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的原则
API:
一个模型建立的过程:
1、pd读取数据
2、选择有影响的特征,处理缺失值
3、进行特征工程,pd转换字典,特征抽取
x_train.to_dict(orient="records")
4、决策树估计器流程
决策树的优缺点以及改进:
这被称为过拟合。
被生成
代码:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
def decision():
"""决策树关于套坦尼克号判断人员生死的问题"""
# 获取数据
taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 处理数据,进行特征值与目标值得选择
x = taitan["pclass", "age", "sex"]
y = taitan["survived"]
# 缺失值处理
x["age"].fillna(x["age"].mean(), inplace=True)
# 分割数据,测试集与训练集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 特征工程:对类别进行处理。one—hot编码,变成字典等操作
# 实例化特征属性
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient="records"))
x_test = dict.transform(x_test.to_dict(orient="records"))
# print(x_train)
# 用决策树进行判断
dec = DecisionTreeClassifier()
dec.fit((x_train, y_train))
# 准确率
print("zhunquelv :", dec.score(x_test, y_test))
def main():
decision()
if __name__ == '__main__':
main()
(二)随机森林:
定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
学习算法
根据下列算法而建造每棵树:
API:
max_depth=None, bootstrap=True, random_state=None)
优点:
代码:
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import GridSearchCV, train_test_split
def random_forest():
"""随机森林"""
# 获取数据
taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 处理数据,进行特征值与目标值得选择
x = taitan["pclass", "age", "sex"]
y = taitan["survived"]
# 缺失值处理
x["age"].fillna(x["age"].mean(), inplace=True)
# 分割数据,测试集与训练集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 特征工程:对类别进行处理。one—hot编码,变成字典等操作
# 实例化特征属性
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient="records"))
x_test = dict.transform(x_test.to_dict(orient="records"))
# print(x_train)
#初始化 Random Forest
rf = RandomForestClassifier()
# 参数调优:网格搜索和交叉验证
# 构造调优参数
param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth":[5, 8, 15, 25, 30]}
gs = GridSearchCV(rf, param_grid=param, cv= 10)
gs.fit(x_train, y_train)
print("准确率:", gs.score(x_test, y_test))
print("选择的参数模型", gs.best_params_)
def main():
random_forest()
if __name__ == '__main__':
main()