Répertoire d'apprentissage:
Répertoire du contenu de l'arbre de décision:
1. Le rôle de l'arbre de décision:
C'est notre processus de prise de décision pour juger s'il s'agit d'un bon melon ou d'un mauvais melon. Le rôle de l' arbre de décision :
1. Aidez-nous à choisir la fonction à utiliser en premier pour if, et la fonction à utiliser pour si, de sorte que nous pouvons rapidement déterminer s'il s'agit d'un bon melon ou d'un mauvais melon. Bad melon
2. Aidez-nous à déterminer la valeur de la fonction comme norme de division
2. Dérivation du principe
3. Prédiction de code:
Comparaison de cas: comparez la précision de classification de l'algorithme d'arbre de décision et de l'algorithme KNN sur l'ensemble de données d'iris
Utilisez l'algorithme d'arbre de décision pour classer l'ensemble de données d'iris:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
def dicision_iris():
"""使用决策树对鸢尾花数据集进行分类
:return:"""
# 获取数据
iris = load_iris()
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
#决策树估计器
estimator=DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train, y_train) # 把训练数据放进去
#模型评估
#方法一:直接比对真实值和预测值
y_predict=estimator.predict(x_test)
print('y_predict:\n',y_predict)
print('直接比对真实值和预测值:\n', y_test==y_predict)
# 方法二:计算准确率
score = estimator.score(x_test,y_test)
print('准确率:\n', score)
if __name__=='__main__':
dicision_iris()
Utilisez l'algorithme KNN pour classer l'ensemble de données d'iris:
Conclusion : L'algorithme KNN est plus précis, car l'algorithme KNN convient à l'origine pour les petits ensembles de données (l'ensemble de données d'iris ne contient que 150 échantillons), et il va calculer la distance un par un. L'arbre de décision est plus adapté aux grands ensembles de données. -------- Différents algorithmes conviennent à différents scénarios
4. Visualisation de l'arbre de décision
Le fichier de points généré:
digraph Tree {
node [shape=box] ;
0 [label="petal width (cm) <= 0.75\nentropy = 1.584\nsamples = 112\nvalue = [39, 37, 36]"] ;
1 [label="entropy = 0.0\nsamples = 39\nvalue = [39, 0, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="petal width (cm) <= 1.75\nentropy = 1.0\nsamples = 73\nvalue = [0, 37, 36]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
3 [label="petal length (cm) <= 5.05\nentropy = 0.391\nsamples = 39\nvalue = [0, 36, 3]"] ;
2 -> 3 ;
4 [label="sepal length (cm) <= 4.95\nentropy = 0.183\nsamples = 36\nvalue = [0, 35, 1]"] ;
3 -> 4 ;
5 [label="petal length (cm) <= 3.9\nentropy = 1.0\nsamples = 2\nvalue = [0, 1, 1]"] ;
4 -> 5 ;
6 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
5 -> 6 ;
7 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 0, 1]"] ;
5 -> 7 ;
8 [label="entropy = 0.0\nsamples = 34\nvalue = [0, 34, 0]"] ;
4 -> 8 ;
9 [label="petal width (cm) <= 1.55\nentropy = 0.918\nsamples = 3\nvalue = [0, 1, 2]"] ;
3 -> 9 ;
10 [label="entropy = 0.0\nsamples = 2\nvalue = [0, 0, 2]"] ;
9 -> 10 ;
11 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
9 -> 11 ;
12 [label="petal length (cm) <= 4.85\nentropy = 0.191\nsamples = 34\nvalue = [0, 1, 33]"] ;
2 -> 12 ;
13 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
12 -> 13 ;
14 [label="entropy = 0.0\nsamples = 33\nvalue = [0, 0, 33]"] ;
12 -> 14 ;
}
Copiez le contenu du fichier dot sur ce site Web:
5. Résumé de l’algorithme de l’arbre de décision:
Avantages:
interprétabilité Visualisation forte
Inconvénients:
Lorsque la quantité de données est très grande, l'arbre de décision sera trop compliquée, ce qui facilement conduire à de bons échantillons de formation et les échantillons pauvres (surapprentissage).
Comment améliorer?
Algorithme de réduction du panier (implémenté dans l'API d'arbre de décision)
algorithme de forêt aléatoire (dans la section suivante)
6. Cas: prédiction de survie des passagers du Titanic
L'extraction de la position, de l'âge, du sexe et autres n'affecte pas sa survie:
traitement des valeurs manquantes dans l'âge, remplissage de la valeur moyenne:
conversion vers un format de dictionnaire:
division de l'ensemble de données, extraction des caractéristiques du dictionnaire, prédicteur d'arbre de décision, évaluation:
Résultats:
import pandas as pd
import graphviz
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
# 获取数据
path = "http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
titanic = pd.read_csv(path)
# 获取特征值与目标值
x = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
# 处理数据
x['age'].fillna(x['age'].mean(), inplace=True)
# 转换成字典
x = x.to_dict(orient='recorda')
# 划分数据
x_train, x_test, y_train, y_test = train_test_split(x, y)
# 字典特征提取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 构建模型
estimator = DecisionTreeClassifier(criterion='entropy')
estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test)
print('预测值与真实值比对:\n', y_predict == y_test)
# 求准确率
score = model.score(x_test, y_test)
print('准确率:\n', score)
# 可视化决策树
image = export_graphviz(
estimator,
out_file="C:/Users/Admin/Desktop/iris_tree.dot",
feature_names=transfer.get_feature_names(),
)
Résumé des algorithmes de classification: