鸢尾花——决策树

现有鸢尾花数据集iris.data。Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal width),4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

现需要进行如下实验:

1、使用pandas库读取数据集,得到相应矩阵,并进项相应的数据预处理:包括数据标准化与鸢尾花类别编码等。

2、采用决策树分类模型(DecisionTreeClassifier)训练鸢尾花数据集,测试集取30%,训练集取70%。

3、特征选择标准criterion请分别选择"gini"与“entropy”,在控制台分别打印出其测试集正确率。请问在iris.data数据及上,选择不同的特征选择标准,结果有无区别?

4、为了提升模型的泛化能力,请分别使用十折交叉验证,确定第三小问中两个决策树模型的参数max_depth(树的最大深度,该特征为最有效的预剪枝参数)与max_features(划分时考虑的最大特征数)的最优取值。max_depth取值范围为1-5,max_features的取值范围为1-4。请在控制台输出这两个参数的最优取值。

5、分别使用最优取值替换模型的参数设置。

6、为了更好的反应模型的预测能力,请在所有数据上使用sklearn的cross_val_score进行十折交叉验证,输出两个模型采用最优参数设置后的平均预测准确率,并在控制台输出。

from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import pandas as pd
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score

if __name__ == "__main__":
    path = 'iris.data'  # 数据文件路径
    data = pd.read_csv(path, header=None)
    x = data[list(range(4))]
    y = LabelEncoder().fit_transform(data[4])   #讲栾尾花类别编码

    x = x.iloc[:, :4]
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
    #进行十折交叉验证的数据预处理

    #criterion='gini'时的情况
    # 使用十折交叉验证获取,max_depth(子树的最大深度)的最优取值
    g1_scores = []
    for i in range(1, 6):
        clf = DecisionTreeClassifier(criterion='gini',max_depth = i )
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        g1_scores.append(scores.mean())
    print('criterion=gini 时:------------------------------------------------------------------')
    print('max_depth 分别取 1~5 时得到的准确率:')
    print(g1_scores)
    print('最优值为: ', max(g1_scores))
    print('最优 max_depth 值为: ', g1_scores.index(max(g1_scores)) + 1)

    # 使用十折交叉验证获取,n_estimators(子树个数)的最优取值
    g2_scores = []
    for i in range(1, 5):
        clf = DecisionTreeClassifier(criterion='gini',max_features = i )
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        g2_scores.append(scores.mean())
    print('max_features 分别取 1~4 时得到的准确率:')
    print(g2_scores)
    print('最优值为: ', max(g2_scores))
    print('最优 max_features 值为: ', g2_scores.index(max(g2_scores)) + 1)

    # criterion='entropy'时的情况
    # 使用十折交叉验证获取,max_depth(子树的最大深度)的最优取值
    m1_scores = []
    for i in range(1, 6):
        clf = DecisionTreeClassifier(criterion='entropy', max_depth=i)
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        m1_scores.append(scores.mean())
    print('criterion= entropy 时:-----------------------------------------------------------------')
    print('max_depth 分别取 1~5 时得到的准确率:')
    print(m1_scores)
    print('最优值为: ', max(m1_scores))
    print('最优 max_depth 值为: ', m1_scores.index(max(m1_scores)) + 1)

    # 使用十折交叉验证获取,n_estimators(子树个数)的最优取值
    m2_scores = []
    for i in range(1, 5):
        clf = DecisionTreeClassifier(criterion='entropy', max_features=i)
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        m2_scores.append(scores.mean())
    print('max_features 分别取 1~4 时得到的准确率:')
    print(m2_scores)
    print('最优值为: ', max(m2_scores))
    print('最优 max_features 值为: ', m2_scores.index(max(m2_scores)) + 1)

猜你喜欢

转载自blog.csdn.net/qq_38054219/article/details/89668013
今日推荐