在面对分类任务中,我们需要从几个方面考虑分类方法的优缺点,常见的评价方法有:
精确率:是针对分类结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。
那么预测为正就有两种可能 了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP), 也就是
P=TP/(TP+FP)
召回率:是对我们原来的样本而言的,它表示的是样本中的正例有多 少被预测正确了。
那也有两种可能,一种是把原来的正类预测成正类(TP), 另一种就是把原来的正类预测为负类(FN),也就是
R=TP/(TP+FN)
F1值:是精确度和召回率的调和平均值
F1=2*(P*R)/(P+R)
F1值在1时达到最佳
实验数据
展示:
记录41种运动信息的feature文件和0-24共25类的label文件
代码详解:
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
def load_dataset(feature_paths,label_paths):
feature= np.ndarray(shape=(0,41))#特征参数有41个
label=np.ndarray(shape=(0,1))#标签有25种,每个运动特征对应一种运动状态
for file in feature_paths:
df=pd.read_table(file,delimiter=',',na_values='?',header=None)#读取数据其中用逗号分隔,缺失值是?,不包含表头
imp=SimpleImputer(strategy='mean')#采用均值填充的方式填补缺失数据
imp.fit(df)
df=imp.transform(df)
feature=np.concatenate((feature,df))#将读入的数据合并到feature[]中
for file in label_paths:
df=pd.read_table(file,header=None)
label=np.concatenate((label,df))
label=np.ravel(label)#将标签转化为一维向量(行向量)
return feature,label
if __name__== '__main__':
feature_paths=['A.feature',
'B.feature',
'C.feature']
label_paths=['A.label',
'B.label',
'C.label']
x_train,y_train=load_dataset(feature_paths[:2],label_paths[:2])#读取前两个数据作为训练集
x_test,y_test= load_dataset(feature_paths[2:],label_paths[2:])#读取最后一个数据作为测试集
x_train,x_test,y_train,y_test=train_test_split(x_train,y_train,test_size=0.2)
#随机划分训练集函数,训练集和测试集的比例为1:5(也可以人为给定测试集数目),并且不设置随即种子#
print('Start training knn')
knn=KNeighborsClassifier().fit(x_train,y_train)
print('Training done!')
answer_knn= knn.predict(x_test)
print('Prediction done!')
print('Start training DT')
dt=DecisionTreeClassifier().fit(x_train,y_train)
print('Training done!')
answer_dt=dt.predict(x_test)
print('Prediction done!')
print('Start training Bayes')
gnb=GaussianNB().fit(x_train,y_train)
print('Training done!')
answer_gnb=gnb.predict(x_test)
print('Prediction done!')
print('\n\nThe classification report for knn:')
print(classification_report(y_test,answer_knn))
print('\n\nThe classification report for dt:')
print(classification_report(y_test,answer_dt))
print('\n\nThe classification report for gnb:')
print(classification_report(y_test,answer_gnb))
实验结果: