import matplotlib.pyplot as plt import pandas as pd import statsmodels.api as sm from matplotlib.font_manager import * from pylab import * from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split #定义自定义字体 myfont = FontProperties(fname='/temp/msyh.ttf') #解决负号'-'显示为方块的问题 plt.rcParams['axes.unicode_minus']=False mpl.rcParams['font.sans-serif'] = ['SimHei'] df = pd.read_csv("/temp/iris.data",names=['花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度', '类别']) clf = RandomForestClassifier(max_depth=5, n_estimators=10) #数据 X = df.ix[:,:4] #结果 y = df.ix[:,4] #随机划分训练集和测试集 ''' train_data:所要划分的样本特征集 train_target:所要划分的样本结果 test_size:样本占比,如果是整数的话就是样本的数量 random_state:是随机数的种子。 ''' X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3) #向量传递到指定分类器 clf.fit(X_train,y_train) #随机森林分类器 y_pred = clf.predict(X_test) rf = pd.DataFrame(list(zip(y_pred, y_test)), columns=['predicted', 'actual']) rf['correct'] = rf.apply(lambda r: 1 if r['predicted'] == r['actual'] else 0, axis=1) #显示结果 print(rf) #显示准确度 print(rf['correct'].sum()/rf['correct'].count())
在import语句之后,第一行看上去很奇怪的代码实例化了我们的分类器,这个例子中是随机森林分类器。这里选择一个使用10个决策树的森林,而每棵树最多允许五层的判定深度。如此实施的原因是为了避免过拟合
接下来的两行创建了X矩阵和y向量。初始的iris数据框包含四个特征:花瓣的宽度和长度,以及花萼的宽度和长度。这些特征被选中并成为独立特征矩阵X。最后一列,iris类别的名称,就成为了因变的y向量。
然后这些被传递到train_test_split方法,该方法将数据打乱并划分为四个子集,X_train,X_test,y_train和y_test。参数test_size被设置为0.3,这意味着数据集的30%将被分配给X_test和y_test部分,而其余的将被分配到训练的部分,X_train和y_train。
接下来,使用训练数据来拟合我们的模型。一旦模型训练完毕,再通过测试数据来调用分类器的预测方法。请记住,测试数据是分类器没有处理过的数据。预测的返回结果是预估标签的列表。然后,我们创建对应实际标签与预估标签的数据框。最终,我们加和正确的预测次数,并将其除以样例的总数,从而看出预测的准确率。
predicted actual correct 0 Iris-versicolor Iris-versicolor 1 1 Iris-virginica Iris-virginica 1 2 Iris-virginica Iris-versicolor 0 3 Iris-setosa Iris-setosa 1 4 Iris-versicolor Iris-versicolor 1 5 Iris-setosa Iris-setosa 1 6 Iris-virginica Iris-virginica 1 7 Iris-versicolor Iris-versicolor 1 8 Iris-setosa Iris-setosa 1 9 Iris-virginica Iris-virginica 1 10 Iris-versicolor Iris-versicolor 1 11 Iris-versicolor Iris-versicolor 1 12 Iris-virginica Iris-virginica 1 13 Iris-setosa Iris-setosa 1 14 Iris-versicolor Iris-versicolor 1 15 Iris-setosa Iris-setosa 1 16 Iris-versicolor Iris-versicolor 1 17 Iris-versicolor Iris-versicolor 1 18 Iris-setosa Iris-setosa 1 19 Iris-virginica Iris-virginica 1 20 Iris-versicolor Iris-versicolor 1 21 Iris-virginica Iris-virginica 1 22 Iris-virginica Iris-versicolor 0 23 Iris-setosa Iris-setosa 1 24 Iris-versicolor Iris-versicolor 1 25 Iris-virginica Iris-virginica 1 26 Iris-setosa Iris-setosa 1 27 Iris-versicolor Iris-versicolor 1 28 Iris-setosa Iris-setosa 1 29 Iris-virginica Iris-virginica 1 30 Iris-virginica Iris-virginica 1 31 Iris-setosa Iris-setosa 1 32 Iris-setosa Iris-setosa 1 33 Iris-versicolor Iris-versicolor 1 34 Iris-versicolor Iris-versicolor 1 35 Iris-setosa Iris-setosa 1 36 Iris-setosa Iris-setosa 1 37 Iris-versicolor Iris-versicolor 1 38 Iris-virginica Iris-virginica 1 39 Iris-versicolor Iris-versicolor 1 40 Iris-setosa Iris-setosa 1 41 Iris-virginica Iris-virginica 1 42 Iris-setosa Iris-setosa 1 43 Iris-setosa Iris-setosa 1 44 Iris-virginica Iris-virginica 1
准确度=0.955555555556