现有鸢尾花数据集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)