机器学习中样本非随机分布时,创建train val test 等文件过程

       上一篇blog写过一个把训练的样本按指定比例随机分配个学习过程,具体见:

https://blog.csdn.net/lingyunxianhe/article/details/81837978

这样做前提是你的类别在样本中是随机或更科学的说是均匀分布的,而不是一个类别集中与连续的某一段数据中,这样你随机产生样本就有可能使得train val test 分配的很不好

      因为自己手动标记的数据,有时为了方便标记,同一个类别的图片可能比较集中,我这有同一个类别样本在连续超过500张图片中占到80%以上,因此为了当分配train val test时合理,在此把连续多张图片中某个类别的样本量占很大比重时,记录在一个txt文件中(用个程序把图片名写入txt文件即可),然后对这个txt集合按train val(我这里是test固定)分配比例分配这个小集合,如果test不固定那还要按train val test比例分配这个小集合,最后把这些小集合整合到一个大集合中去即可,具体代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 2018/08/11 by DQ
 
import os 
import random 

MidFolder='py-faster-rcnn' 
MainFolder=os.path.join('/home/KingMe/project',MidFolder,'data/FABdevkit2017/FAB2017/ImageSets/Main')
AnotFolder=os.path.join('/home/KingMe/project',MidFolder,'data/FABdevkit2017/FAB2017/Annotations')
fileIdLen=6 #
CurImNum=len(os.listdir(AnotFolder)) 

######################last start#############################
def CreateImIdTxt(ImIdS,FilePath):
	if os.path.exists(FilePath):
		os.remove(FilePath)
	with open(FilePath,'w') as FId:
		for ImId in ImIdS:
			ImIdStr=str(ImId).zfill(fileIdLen)+'\n'
			FId.writelines(ImIdStr) 


#获取指定txt文档记录的图片集合名
def GetPointTxtImIdSet(FilePath):	
	ImIdSet=[]
	if os.path.exists(FilePath):
		with open(FilePath) as FId:
			TxtList=FId.readlines()
			#print TxtList
		for TxtStr in TxtList:
			ImId=TxtStr.split()
			ImIdSet.append(int(ImId[0]))
	return ImIdSet


def AssignImIdSetAsRatio(ImIdSet,TrainR):
	random.shuffle(ImIdSet)
	ImNum=len(ImIdSet)
	TrainNum=int(TrainR*ImNum)	
	TrainImId=ImIdSet[:TrainNum-1]	
	ValImId=list(set(ImIdSet).difference(set(TrainImId)))

	return TrainImId,ValImId


def WriteImIdSet2TrainValTxt(TrainImId,ValImId,TrainValImId):
	TrainImId.sort()
	ValImId.sort()
	TrainValImId.sort()

	TrainValTestIds={}
	TrainValTestIds['train']=TrainImId
	TrainValTestIds['val']=ValImId
	TrainValTestIds['trainval']=TrainValImId

	TrainValTestFiles={'train':'train.txt','val':'val.txt','trainval':'trainval.txt'} 
	for Key,KeyVal in TrainValTestFiles.iteritems():
		print 'start create '+ Key+' ImSet'
		ImIdS=TrainValTestIds[Key]
		FileName=TrainValTestFiles[Key]
		FilePath=os.path.join(MainFolder,FileName)
		CreateImIdTxt(ImIdS,FilePath)


def FixTestDeassignTrainVal():
	TrainR=0.7

	SubFolder='TestSetOrOtherBackup'	
	FileName='test.txt'#测试集合固定,我这里有两个类别	 
	FilePath=os.path.join(MainFolder,SubFolder,FileName)
	TestImIdSet=GetPointTxtImIdSet(FilePath)
	FileName='7480_8594ManyBlis.txt'	 
	FilePath=os.path.join(MainFolder,SubFolder,FileName)
	ManyBlisImIdSet=GetPointTxtImIdSet(FilePath)#获取txt记录的连续多张图片中某个类别的样本量占很大比重的图片名	
	FileName='8594-8879ManyBreak.txt'	 
	FilePath=os.path.join(MainFolder,SubFolder,FileName)
	ManyBreakImIdSet=GetPointTxtImIdSet(FilePath)#获取txt记录的连续多张图片中某个类别的样本量占很大比重的图片名	

	ImIdSet0=range(1,CurImNum+1)
	ImIdSet1=list(set(ImIdSet0).difference(set(TestImIdSet)))#从总集合中去除测试集合
	ImIdSet2=list(set(ImIdSet1).difference(set(ManyBlisImIdSet)))
	ImIdSet=list(set(ImIdSet2).difference(set(ManyBreakImIdSet)))
	
	TrainImId,ValImId=AssignImIdSetAsRatio(ImIdSet,TrainR)#非txt记录的集合按比例分配
	MBlistTrainImId,MBlistValImId=AssignImIdSetAsRatio(ManyBlisImIdSet,TrainR)#txt记录的小集合单独按比例分配
	MBreakTrainImId,MBreakValImId=AssignImIdSetAsRatio(ManyBreakImIdSet,TrainR)#txt记录的小集合单独按比例分配
        #小集合合并为大集合
	TrainImId=TrainImId+MBlistTrainImId+MBreakTrainImId
	ValImId=ValImId+MBlistValImId+MBreakValImId
	TrainValImId=ImIdSet1
	
	WriteImIdSet2TrainValTxt(TrainImId,ValImId,TrainValImId)
######################last end#############################

FixTestDeassignTrainVal()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型的好坏评估是常重要的,因为这可以帮助我们了解模型的性能并决定是否需要进行调整或优化。以下是几种常见的模型评估方法。 ## 一、训练集和测试集 训练集和测试集是最基本的模型评估方法。我们将数据分为两部分:训练集和测试集。通常将训练集占总数据的 70-80%,剩余 20-30% 用于测试。先使用训练集进行模型训练,然后使用测试集来测试模型的性能。 下面是一个Python示例: ```python from sklearn.model_selection import train_test_split # 将数据分为训练集和测试集,test_size表示测试集所占比例 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` ## 二、交叉验证 交叉验证是一种更加稳健的模型评估方法。它将数据分为 k 个部分,然后进行 k 次训练和测试,每次选取不同的部分作为测试集,其余部分作为训练集。最终将每次测试的结果取平均值作为模型的评估指标。 下面是一个Python示例: ```python from sklearn.model_selection import cross_val_score # 交叉验证 scores = cross_val_score(model, X, y, cv=5) print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2)) ``` ## 三、混淆矩阵 混淆矩阵是一种用于可视化分类模型性能的技术。它将真实类别和预测类别进行比较,并将结果显示在一个矩阵。矩阵的行表示真实类别,列表示预测类别。对角线上的数字表示模型正确分类的数量,其他位置的数字表示模型错误分类的数量。 下面是一个Python示例: ```python from sklearn.metrics import confusion_matrix # 计算混淆矩阵 y_pred = model.predict(X_test) confusion_matrix(y_test, y_pred) ``` ## 四、ROC曲线和AUC ROC曲线和AUC是评估二分类模型性能的经典方法。ROC曲线是通过绘制真阳性率(True Positive Rate)和假阳性率(False Positive Rate)得到的。真阳性率是指正确预测为正样本的数量除以所有正样本的数量,假阳性率是指错误预测为正样本的数量除以所有负样本的数量。AUC是ROC曲线下的面积,通常被用作模型性能度量标准,其取值范围在 0.5 到 1 之间。 下面是一个Python示例: ```python from sklearn.metrics import roc_curve, auc # 计算ROC曲线和AUC y_score = model.decision_function(X_test) fpr, tpr, thresholds = roc_curve(y_test, y_score) roc_auc = auc(fpr, tpr) # 绘制ROC曲线 plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc) plt.plot([0, 1], [0, 1], 'k--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating characteristic example') plt.legend(loc="lower right") plt.show() ``` 以上就是机器学习常用的模型评估方法,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值