鸢尾花分类实战:
鸢尾花数据集是机器学习领域一个非常经典的分类数据集。接下来,我们就用这个作为训练集为基础,一步一步地训练机器学习模型。首先我们来看下数据集的基本构成。数据集名称的准确名称为 Iris Data Set,总共包含了150行数据。每一行数据由4个特征值及一个目标值组成。其中4个也正值分别为:儿骗长度,儿骗宽度,滑板长度,花瓣宽度。而目标值及为三中不同类别的鸢尾花,分别为:Iris Setosa,Iris Versicolour,Iris Virginica。
查看简单的特征数:
from sklearn import datasets
iris = datasets.load_iris()
iris_feature = iris.data
iris_target = iris.target
print(iris_target)
>>>
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
这里,scikit-learn已经将花的原名进行了转换,其中0,1,2分别代表Iris Setosa,Iris Versicolour,Iris Virginica。
这些写数据是按照鸢尾花类别的顺序排列的。所以,如果我们将其直接划分为训练集和数据集的话,就会造成数据的分布不均。详细来讲,直接划分容易造成某种类型的花在训练集中一次都未出现,训练的模型就哟永远不可能预测出这种话来。你可能会想到,我们将这些数据打乱后再划分训练集和数据集。当然,更方便地,scikit-learn为我们提供了训练集和数据集的方法。
from sklearn.model_selection import train_test_split
from sklearn import datasets
iris = datasets.load_iris()
iris_feature = iris.data
iris_target = iris.target
feature_train,feature_test,target_train,target_test = train_test_split(iris_feature,iris_target,test_size=0.3,random_state=42)
print(target_train)
>>>
arrary[1 2 2 1 2 1 2 1 0 2 1 0 0 0 1 2 0 0 0 1 0 1 2 0 1 2 0 2 2 1 1 2 1 0 1 2 0
0 1 1 0 2 0 0 1 1 2 1 2 2 1 0 0 2 2 0 0 0 1 2 0 2 2 0 1 1 2 1 2 0 2 1 2 1
1 1 0 1 1 0 1 2 2 0 1 2 2 0 2 0 1 2 2 1 2 1 1 2 2 0 1 2 0 1 2]
其中,feature_train,feature_test,target_train,target_test分别代表训练集特征,测试特集征集,训练集目标值,测试集目标值。test_size参数代表划分到测试集数据占全部数据的百分比,你也可以用train_size来指定训练集所占全部数据的百分比。一般情况下,我们会将整个训练集划分为70%训练集和30%测试集。最后的random_state参数表示乱序程度。
现在花的种类已经变成了乱序状态,并且只包含有整个训练集的70%数据。
模型训练和预测
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets
iris = datasets.load_iris()
iris_feature = iris.data
iris_target = iris.target
feature_train,feature_test,target_train,target_test = train_test_split(iris_feature,iris_target,test_size=0.3,random_state=42)
dt_model = DecisionTreeClassifier()
dt_model.fit(feature_train,target_train)
predict_results = dt_model.predict(feature_test)
print(predict_results)
print(target_test)
>>>
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 1
0 0 0 2 1 1 0 0]
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 1
0 0 0 2 1 1 0 0]
可以通过scikit_learn中提供的评估计算方法查看预测结果的准确度
from sklearn.metrics import accuracy_score
print(accuracy_score(predict_results,target_test))
>>>
1.0