教女朋友学数据挖掘——泰坦尼克号获救预测( 八 )


The accuracy of the Random Forests is 0.820895522388
模型的精度并不是决定分类器效果的唯一因素 。假设分类器在训练数据上进行训练,需要在测试集上进行测试才有效果
现在这个分类器的精确度很高,但是我们可以确认所有的新测试集都是90%吗?答案是否定的,因为我们不能确定分类器在不同数据源上的结果 。当训练和测试数据发生变化时,精确度也会改变 。它可能会增加或减少 。
为了克服这一点,得到一个广义模型,我们使用交叉验证 。
6.2 交叉验证
一个测试集看起来不太够呀,多轮求均值是一个好的策略!
1)交叉验证的工作原理是首先将数据集分成k- 。
2)假设我们将数据集划分为(k=5)部分 。我们预留1个部分进行测试,并对这4个部分进行训练 。
3)我们通过在每次迭代中改变测试部分并在其他部分中训练算法来继续这个过程 。然后对衡量结果求平均值,得到算法的平均精度 。
这就是所谓的交叉验证 。
from sklearn.model_selection import KFold #for K-fold cross validationfrom sklearn.model_selection import cross_val_score #score evaluationfrom sklearn.model_selection import cross_val_predict #predictionkfold = KFold(n_splits=10, random_state=22) # k=10, split the data into 10 equal partsxyz=[]accuracy=[]std=[]classifiers=['Linear Svm','Radial Svm','Logistic Regression','KNN','Decision Tree','Naive Bayes','Random Forest']models=[svm.SVC(kernel='linear'),svm.SVC(kernel='rbf'),LogisticRegression(),KNeighborsClassifier(n_neighbors=9),DecisionTreeClassifier(),GaussianNB(),RandomForestClassifier(n_estimators=100)]for i in models:model = icv_result = cross_val_score(model,X,Y, cv = kfold,scoring = "accuracy")cv_result=cv_resultxyz.append(cv_result.mean())std.append(cv_result.std())accuracy.append(cv_result)new_models_dataframe2=pd.DataFrame({'CV Mean':xyz,'Std':std},index=classifiers)new_models_dataframe2
CV
Svm
0.
0.
Svm
0.
0.
0.
0.
KNN
0.
0.
Tree
0.
0.
Naive Bayes
0.
0.
0.
0.
plt.subplots(figsize=(12,6))box=pd.DataFrame(accuracy,index=[classifiers])box.T.boxplot()

new_models_dataframe2['CV Mean'].plot.barh(width=0.8)plt.title('Average CV Mean Accuracy')fig=plt.gcf()fig.set_size_inches(8,5)plt.show()
混淆矩阵,它给出分类器的正确和不正确分类的数量:
f,ax=plt.subplots(3,3,figsize=(12,10))y_pred = cross_val_predict(svm.SVC(kernel='rbf'),X,Y,cv=10)sns.heatmap(confusion_matrix(Y,y_pred),ax=ax[0,0],annot=True,fmt='2.0f')ax[0,0].set_title('Matrix for rbf-SVM')y_pred = cross_val_predict(svm.SVC(kernel='linear'),X,Y,cv=10)sns.heatmap(confusion_matrix(Y,y_pred),ax=ax[0,1],annot=True,fmt='2.0f')ax[0,1].set_title('Matrix for Linear-SVM')y_pred = cross_val_predict(KNeighborsClassifier(n_neighbors=9),X,Y,cv=10)sns.heatmap(confusion_matrix(Y,y_pred),ax=ax[0,2],annot=True,fmt='2.0f')ax[0,2].set_title('Matrix for KNN')y_pred = cross_val_predict(RandomForestClassifier(n_estimators=100),X,Y,cv=10)sns.heatmap(confusion_matrix(Y,y_pred),ax=ax[1,0],annot=True,fmt='2.0f')ax[1,0].set_title('Matrix for Random-Forests')y_pred = cross_val_predict(LogisticRegression(),X,Y,cv=10)sns.heatmap(confusion_matrix(Y,y_pred),ax=ax[1,1],annot=True,fmt='2.0f')ax[1,1].set_title('Matrix for Logistic Regression')y_pred = cross_val_predict(DecisionTreeClassifier(),X,Y,cv=10)sns.heatmap(confusion_matrix(Y,y_pred),ax=ax[1,2],annot=True,fmt='2.0f')ax[1,2].set_title('Matrix for Decision Tree')y_pred = cross_val_predict(GaussianNB(),X,Y,cv=10)sns.heatmap(confusion_matrix(Y,y_pred),ax=ax[2,0],annot=True,fmt='2.0f')ax[2,0].set_title('Matrix for Naive Bayes')plt.subplots_adjust(hspace=0.2,wspace=0.2)plt.show()