Python 机器学习-决策树

  • 决策树

    在本章中,我们将向您展示如何制作“决策树”。决策树是流程图,可以帮助您根据以前的经验来做出决策。
    在该示例中,一个人将尝试决定是否应参加喜剧节目。幸运的是,我们的模范人物每次在镇上举办喜剧节目时都要进行注册,并注册关于喜剧演员的一些信息,并且还注册他/她是否去过。
    Age Experience Rank Nationality Go
    36 10 9 UK NO
    42 12 4 USA NO
    23 4 6 N NO
    52 4 4 USA NO
    43 21 8 USA YES
    44 14 5 UK NO
    66 3 7 N YES
    35 14 9 UK YES
    52 13 7 N YES
    35 5 9 N YES
    24 3 5 USA NO
    18 3 7 UK YES
    45 9 9 UK YES
    现在,基于此数据集,Python可以创建决策树,该决策树可用于确定是否值得参加任何新的演出。
  • 它是如何工作的?

    首先,导入所需的模块,并使用pandas读取数据集:
    读取并打印数据集:
    import pandas
    from sklearn import tree
    import pydotplus
    from sklearn.tree import DecisionTreeClassifier
    import matplotlib.pyplot as plt
    import matplotlib.image as pltimg
    
    df = pandas.read_csv("shows.csv")
    
    print(df)
    输出如下::
    ml
    要制定决策树,所有数据都必须为数字。我们必须将非数字列“Nationality”和“Go”转换为数值。Pandas有一种map()方法,该方法采用字典,其中包含有关如何转换值的信息。{'UK': 0, 'USA': 1, 'N': 2}表示将值“UK”转换为0,将“USA”转换为1,将“N”转换为2。
    将字符串值更改为数值:
    import pandas
    from sklearn import tree
    import pydotplus
    from sklearn.tree import DecisionTreeClassifier
    import matplotlib.pyplot as plt
    import matplotlib.image as pltimg
    
    df = pandas.read_csv("shows.csv")
    
    d = {'UK': 0, 'USA': 1, 'N': 2}
    df['Nationality'] = df['Nationality'].map(d)
    d = {'YES': 1, 'NO': 0}
    df['Go'] = df['Go'].map(d)
    
    print(df)
    输出如下::
    ml
    然后,我们必须将要素列与目标列分开。 特征列,我们试图预测列从和目标列是我们试图预测值的列。
    X是要素列, y是目标列:
    import pandas
    from sklearn import tree
    import pydotplus
    from sklearn.tree import DecisionTreeClassifier
    import matplotlib.pyplot as plt
    import matplotlib.image as pltimg
    
    df = pandas.read_csv("shows.csv")
    
    d = {'UK': 0, 'USA': 1, 'N': 2}
    df['Nationality'] = df['Nationality'].map(d)
    d = {'YES': 1, 'NO': 0}
    df['Go'] = df['Go'].map(d)
    
    features = ['Age', 'Experience', 'Rank', 'Nationality']
    
    X = df[features]
    y = df['Go']
    
    print(X)
    print(y) 
    
    
    输出如下::
    ml
    创建一个决策树,将其另存为图像,然后显示该图像:
    X是要素列, y是目标列:
    import pandas
    from sklearn import tree
    import pydotplus
    from sklearn.tree import DecisionTreeClassifier
    import matplotlib.pyplot as plt
    import matplotlib.image as pltimg
    
    df = pandas.read_csv("shows.csv")
    
    d = {'UK': 0, 'USA': 1, 'N': 2}
    df['Nationality'] = df['Nationality'].map(d)
    d = {'YES': 1, 'NO': 0}
    df['Go'] = df['Go'].map(d)
    
    features = ['Age', 'Experience', 'Rank', 'Nationality']
    
    X = df[features]
    y = df['Go']
    
    dtree = DecisionTreeClassifier()
    dtree = dtree.fit(X, y)
    data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
    graph = pydotplus.graph_from_dot_data(data)
    graph.write_png('mydecisiontree.png')
    
    img=pltimg.imread('mydecisiontree.png')
    imgplot = plt.imshow(img)
    plt.show() 
    
    
    输出如下::
    ml
  • 结果说明

    决策树使用您先前的决策来计算您是否愿意去看喜剧演员的几率。让我们阅读决策树的各个不同方面:
    第一层:
    • Rank <= 6.5表示所有排名6.5或以下的喜剧演员都将遵循 True箭头(左侧),其余的将遵循False箭头(右侧)。
    • gini = 0.497 指的是分割的质量,并且始终是介于0.0和0.5之间的数字,其中0.0表示所有样本均获得相同的结果,而0.5表示分割完全在中间进行。
    • samples = 13 表示此时决策中还剩下13位喜剧演员,因为这是第一步,所以他们全都是。
    • value = [6, 7] 表示在这13位喜剧演员中,有6位将获得“否”,而7位将获得“GO”。
    分割样本的方法有很多,我们在本教程中使用gini方法。基尼方法使用以下公式:
    Gini = 1 - (x/n)2 (y/n)2
    其中x,肯定答案的数量(“GO”), n是样本 y数和否定答案的数量(“NO”),这使我们进行了以下计算:
    1 - (7/13)2 - (6/ 13)2 = 0.497
    第二层,其“Rank”为6.5或更低,其余的则为一个框。
    True - 5名喜剧演员在这里决策结束:
    • gini = 0.0 表示所有样本都得到相同的结果。
    • samples = 5 表示此分支中还剩下5位喜剧演员(5位等级为6.5或更低的喜剧演员)。
    • value = [5, 0] 表示5表示“否”,0表示“GO”。
    False - 8位喜剧演员继续:
    • Rank <= 8.5 表示Rank值小于等于8.5的喜剧演员将跟随左箭头,其余喜剧演员将遵循右箭头。
    • gini = 0.219 表示约有22%的样本会朝一个方向移动。
    • samples = 8 表示该分支中还剩下8位喜剧演员(8位等级高于6.5的喜剧演员)。
    • value = [1, 7] 表示在这8位喜剧演员中,有1位表示“否”,而7位则表示“GO”。
    第三层:
    True - 4名喜剧演员在这里决策结束:
    • gini = 0.0 表示所有样本都得到相同的结果。
    • samples = 4 表示此分支中还剩下4位喜剧演员(4位Rank <= 8.5的演员)。
    • value = [0, 4] 表示在这4位喜剧演员中,0将获得“否”,而4将获得“ GO”。
    True - 4名喜剧演员继续:
    • Experience <= 9.5 表示经验在9.5或以下的喜剧演员将遵循左侧的箭头,其余的将遵循右侧的箭头。
    • gini = 0.375 意味着大约37.5%的样本会朝一个方向移动。
    • samples = 4 表示该分支中还剩下4位喜剧演员(Rank > 8.5 的演员)。
    • value = [1, 3] 表示在这4位喜剧演员中,1位将获得“否”,而3位将获得“GO”。
    第四层::
    True - 2名喜剧演员在这里结束:
    • gini = 0.0 表示所有样本都得到相同的结果。
    • samples = 2 表示该分支中还剩下2名喜剧演员(2名 Experience <= 9.5 的喜剧演员)。
    • value = [0, 2] 表示在这2位喜剧演员中,0将获得“否”,而2将获得“GO”。
    True - 2名喜剧演员继续:
    • Age <= 35.5 表示年龄在35.5或以下喜剧演员将遵循左侧的箭头,其余的将遵循右侧的箭头。
    • gini = 0.5 表示50%的样本会朝一个方向移动。
    • samples = 2 表示此分支中还剩下2位喜剧演员(2位年经验大于9.5年的喜剧演员)。
    • value = [1, 1] 表示在这2位喜剧演员中,1位将获得“否”,而1位将获得“ GO”。
    第五层::
    True - 1名喜剧演员到此为止:
    • gini = 0.0 表示所有样本都得到相同的结果。
    • samples = 1 表示此分支中还剩下1名喜剧演员(1名具有9.5年或更短经验的喜剧演员)。
    • value = [0, 1] 表示0表示“否”,1表示“ GO”。
    False - 1名喜剧演员到此为止:
    • gini = 0.0 表示所有样本都得到相同的结果。
    • samples = 1 表示此分支中还剩下1位喜剧演员(其中1位年龄大于35.5岁的喜剧演员)。
    • value = [1, 0] 表示1表示“否”,0表示“ GO”。
  • 预测值

    我们可以使用决策树来预测新值。
    示例:我是否应该去看一个由40岁的美国喜剧演员主演的节目,该喜剧演员有10年的经验,喜剧排名为7?
    使用predict()方法来预测新值:
    import pandas
    from sklearn import tree
    import pydotplus
    from sklearn.tree import DecisionTreeClassifier
    import matplotlib.pyplot as plt
    import matplotlib.image as pltimg
    
    df = pandas.read_csv("shows.csv")
    
    d = {'UK': 0, 'USA': 1, 'N': 2}
    df['Nationality'] = df['Nationality'].map(d)
    d = {'YES': 1, 'NO': 0}
    df['Go'] = df['Go'].map(d)
    
    features = ['Age', 'Experience', 'Rank', 'Nationality']
    
    X = df[features]
    y = df['Go']
    
    dtree = DecisionTreeClassifier()
    dtree = dtree.fit(X, y)
    print(dtree.predict([[40, 10, 7, 1]]))
    
    输出如下::显然答案是肯定的
    ml
    如果喜剧Rank为6,答案是什么?
    import pandas
    from sklearn import tree
    import pydotplus
    from sklearn.tree import DecisionTreeClassifier
    import matplotlib.pyplot as plt
    import matplotlib.image as pltimg
    
    df = pandas.read_csv("shows.csv")
    
    d = {'UK': 0, 'USA': 1, 'N': 2}
    df['Nationality'] = df['Nationality'].map(d)
    d = {'YES': 1, 'NO': 0}
    df['Go'] = df['Go'].map(d)
    
    features = ['Age', 'Experience', 'Rank', 'Nationality']
    
    X = df[features]
    y = df['Go']
    
    dtree = DecisionTreeClassifier()
    dtree = dtree.fit(X, y)
    print(dtree.predict([[40, 10, 6, 1]]))
    
    输出如下::我们看到答案是否定的
    ml
    不同的结果,如果运行足够多次,即使您使用相同的数据来获取决策树,也会看到不同的结果。那是因为决策树无法给我们100%的肯定答案。它基于结果的可能性,答案会有所不同。