交叉验证法,主要作用是用于评估比较不同学习模型的预测性能,可在模型调优的过程中发挥一定的作用。
P次K折交叉验证法 实现过程:
1、原始数据打乱,使得数据划分为随机划分。
2、将数据划分为K份,保证每份数据不重叠,全部数据不遗漏。分类任务中,划分过程尽量保证每份预测的类别比例相同。
3、每次选取K-1份为训练集,剩下的一份为测试集,用训练集来训练模型,测试集来评估模型,获得评估值。重复K次,即可获得K个模型性能评估值:
4、将2、3两步重复P次,即为P次K折交叉验证法。获得性能评估值为P*K个,取其均值作为该学习模型的性能评价值:
python代码实现:
from random import shuffle
import pandas as pd
class K_flod():
def __init__(self,data,Label,k):
self.data = data
self.Label = Label
self.k = k
def LabelDict(self):
Labellist = self.data[self.Label].unique()
Dict = {i:self.data[self.data[self.Label] == i ] for i in Labellist}
for key in Dict.keys():
Dict[key] = Dict[key].reset_index(drop = True)
Dict[key] = self.dataCut(Dict[key])
return Dict
def dataCut(self,df):
mod,aliquot = len(df)%self.k,len(df)//self.k
dividNum_list = [aliquot]*self.k
for i in range(mod):
dividNum_list[i] += 1
df_list = [None]*self.k
start_index,end_index = 0,0
for i in range(self.k):
end_index += dividNum_list[i]
df_list[i] = df.loc[start_index:end_index-1]
start_index = end_index
return df_list
def random(self):
index = [i for i in self.data.index]
shuffle(index)
self.data = self.data.loc[index].reset_index(drop = True)
def divide(self):
self.random()
df_dict = self.LabelDict()
divide_dict = {}
for i in range(self.k):
temp = pd.DataFrame()
for key in df_dict.keys():
if len(df_dict[key][i])>0:
temp = temp.append(df_dict[key][i])
divide_dict[i] = temp
return divide_dict
if __name__ == "__main__":
test_df = pd.DataFrame()
test_df["Name"],test_df["Label"] = list("ABCDEFGHIJ"*5),[1,2]*25
Label,k="Label",3
flod = K_flod(test_df,Label,k)
dict_temp = flod.divide()
print(dict_temp)
'''
得到分成K个数据集得字典,即训练验证子集
'''