11.14 机器学习-朴素贝叶斯+决策树算法
# 贝叶斯底层逻辑 一个数据有可能是几种 结果 选一个概率最高的结果赋给它
# 朴素贝叶斯 假设各个特征之间全部独立 P(A*B*C*D*E)=P(A)*P(B)*P(C)*P(D)*P(E)
# A是特征向量 B是结果
# P(B|A)=P(A|B)*P(B)/P(A)
# P(A|X1,X2,X3,X4,X5)=P(X1,X2,X3,X4,X5|A)*P(A)/P(X1,X2,X3,X4,X5)
# 由于特征之间独立
# P(X1,X2,X3,X4,X5|A)=P(X1|A)*P(X2|A)*P(X3|A)*P(X4|A)*P(X5|A)*P(A)/(P(X1)*P(X2)*P(X3)*P(X4)*P(X5)) #这个式字就可以 用数据集计算出来了
# 拉普拉斯平滑系数 为了防止0概率的出现 这样即使 x2/A一个都没有也不会出现0概率的情况 这个概率要拿去乘的
# P(X2|A)= A发生的概率下x2发生的数量+1 / A发生的数量 + 有多少种X
# API
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
import joblib
import pandas as pd
from scipy.stats import mode
def naive_bayes1():
# sklearn.naive_bayes.MultinomialNB()
# estimator.fit(x_train, y_train)
# y_predict = estimator.predict(x_test)
X,y=load_iris(return_X_y=True)
X_train,X_test,y_train,y_test=train_test_split(X,y,stratify=y,random_state=666,train_size=0.7)
# 创建 朴素贝叶斯 预估器
NB1=MultinomialNB()
NB1.fit(X_train,y_train)
score=NB1.score(X_test,y_test)
print(score)
# 保存模型
# joblib.dump(NB1,"assets/model/NB_iris.pkl")
flow1=[[5,3,2,4],[3,6,2,1],[6,2,4,2]]
res=NB1.predict(flow1)
print(load_iris().target_names[res])
pass
def naive_bayes2():
df1 = pd.read_csv("assets/csv/titanic.csv")
x = df1[["age", "sex", "pclass"]]
y = df1["survived"]
# 计算 age 列的众数
age_mode = mode(x["age"].dropna())[0] # 使用 dropna() 去掉 NaN 值后计算众数
# print(age_mode)
# 用众数填充 age 列中的 NaN 值
x["age"].fillna(age_mode, inplace=True)
# 处理 性别字符串变为 数字
x["sex"] = x["sex"].map({"female": 1, "male": 0}) #方式1
# # 方式2
# x2=x["sex"]=="female"
# x["sex"]=x2
# 处理 pclass字符串变为 数字
x["pclass"] = x["pclass"].map({"1st": 1, "2nd": 2,"3rd":3})
X_train,X_test,y_train,y_test=train_test_split(x,y,stratify=y,random_state=666,train_size=0.7)
# 创建 朴素贝叶斯 预估器
NB1=MultinomialNB()
NB1.fit(X_train,y_train)
score=NB1.score(X_test,y_test)
print(score)
# print(y)
if __name__=="__main__":
# naive_bayes1()
naive_bayes2()
pass
# 1、决策节点
# 通过条件判断而进行分支选择的节点。如:将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。
# 2、叶子节点
# 没有子节点的节点,表示最终的决策结果。
# 3、决策树的深度
# 所有节点的最大层次数。
# 决策树具有一定的层次结构,根节点的层次数定为0,从下面开始每一层子节点层次数增加
# 4、决策树优点:
# 可视化 - 可解释能力-对算力要求低
# 5、 决策树缺点:
# 容易产生过拟合,所以不要把深度调整太大了。
# 基于信息增益决策树的建立 根据信息增益决定先判断谁 信息增益高的先判断
# 信息增益决策树倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息,算法只能对描述属性为离散型属性的数据集构造决策树
# 信息熵描述的是不确定性。信息熵越大,不确定性越大。信息熵的值越小,则D的纯度越高。
# 算结果的信息熵 每个特征的信息增益=结果的信息熵 - 本身的信息熵
# 基于基尼指数决策树的建立(了解)
# API
# class sklearn.tree.DecisionTreeClassifier(....)
# 参数:
# criterion "gini" "entropy” 默认为="gini"
# 当criterion取值为"gini"时采用 基尼不纯度(Gini impurity)算法构造决策树,
# 当criterion取值为"entropy”时采用信息增益( information gain)算法构造决策树.
# max_depth int, 默认为=None 树的最大深度
# # 可视化决策树
# function sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)
# 参数:
# estimator决策树预估器
# out_file生成的文档
# feature_names节点特征属性名
# 功能:
# 把生成的文档打开,复制出内容粘贴到"http://webgraphviz.com/"中,点击"generate Graph"会生成一个树型的决策树图
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
def decision_tree_classifier():
model1=DecisionTreeClassifier(criterion="entropy",max_depth=2) # criterion 构建决策树的方式 entropy 为信息增益方式 默认为gini方式 max_depth决策树的深度 默认为2
X,y=load_iris(return_X_y=True)
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=0.7,random_state=666)
sacler1=StandardScaler()
x_stand_train=sacler1.fit_transform(X_train)
x_stand_test=sacler1.transform(X_test)
model1.fit(x_stand_train,y_train)
score= model1.score(x_stand_test,y_test)
print(score)
# 决策树可视化
export_graphviz(model1,feature_names=load_iris().feature_names,out_file="assets/dot/iris_tree.dot")
if __name__=="__main__":
decision_tree_classifier()
pass