python实现交叉验证,交叉验证Python
本文主要介绍python leave-one交叉验证的示例代码,有很好的参考价值,希望对大家有所帮助。如有错误或不足之处,请不吝赐教。
目录
python留一法交叉验证基本原理代码实现留一法交叉验证留一法交叉验证我们用SKlearn库实现LOO吧。
python 留一交叉验证
基本原理
K折交叉验证
简单地说,K倍交叉验证是:
将数据集分成K份,取出一份作为测试集,另外K-1份作为训练集。通过训练集得到回归方程,然后将测试集带入回归方程得到预测值。计算预测值与真实值之差的平方,得到平方损失函数(或其他损失函数)。重复上述过程,共得到K个回归方程和K个损失函数,损失函数最小的回归方程为最优解。留一交叉验证
一左交叉验证是K重交叉验证的一个特例,即把数据集分成N份,N是数据集的总数。也就是说,只留下一个数据作为测试集。这个特例叫做“留一交叉验证”。
代码实现
留下交叉验证
将numpy作为np导入
# K折叠交叉验证
数据=[[12,1896年],[11,1900年],[11,1904年],[10.8,1908年],[10.8,1912年],[10.8,1920年],[10.6,1924年],[10.8,1928年],
[10.3, 1932], [10.3, 1936], [10.3, 1948], [10.4, 1952], [10.5, 1956], [10.2, 1960], [10.0, 1964], [9.95, 1968],
[10.14, 1972], [10.06, 1976], [10.25, 1980], [9.99, 1984], [9.92, 1988], [9.96, 1992], [9.84, 1996],
[9.87, 2000], [9.85, 2004], [9.69, 2008]]
长度=长度(数据)
#获取训练集和测试集
def Get_test_train(长度,数据,i):
Test_data=data[i] #测试集
train_data=data[:]
Train_data.pop(i) #训练集
返回训练数据,测试数据
#得到一条线性回归线
定义获取行(训练数据):
时间=[]
年份=[]
average_year_time=0
average_year_year=0
对于列车_数据:中的I
time.append(i[0])
year.append(i[1])
time=np.array(time)
year=np.array(年)
Average _ year=sum(年)/length # year
average _ time=sum(time)/length # time
对于列车_数据:中的I
average _ year _ time=average _ year _ time I[0]* I[1]
average _ year _ year=average _ year _ year I[1]* * 2
average _ year _ time=average _ year _ time/length #(年,时间)
平均_年_年=平均_年_年/长度#(年,年)。
#线性回归:t=w0 w1 * x
w1=(平均年时间-平均年*平均时间)/(平均年
r_year - average_year * average_year)
w0 = average_time - w1 * average_year
return w0, w1
# 得到损失函数
def Get_loss_func(w0, w1, test_data):
time_real = test_data[0]
time_predict = eval({} + {} * {}.format(w0, w1, test_data[1]))
loss = (time_predict - time_real) ** 2
dic[t = {} + {}x.format(w0, w1)] = loss
return dic
if __name__ == __main__:
dic = {} # 存放建为回归直线,值为损失函数的字典
for i in range(length):
train_data, test_data = Get_test_train(length, data, i)
w0, w1 = Get_line(train_data)
Get_loss_func(w0, w1, test_data)
dic = Get_loss_func(w0, w1, test_data)
min_loss = min(dic.values())
best_line = [k for k, v in dic.items() if v == min_loss][0]
print(最佳回归直线:, best_line)
print(最小损失函数:, min_loss)
留一法交叉验证 Leave-One-Out Cross Validation
交叉验证法,就是把一个大的数据集分为 k 个小数据集,其中 k−1 个作为训练集,剩下的 1 11 个作为测试集,在训练和测试的时候依次选择训练集和它对应的测试集。这种方法也被叫做 k 折交叉验证法(k-fold cross validation)。最终的结果是这 k 次验证的均值。
此外,还有一种交叉验证方法就是 留一法(Leave-One-Out,简称LOO),顾名思义,就是使 k kk 等于数据集中数据的个数,每次只使用一个作为测试集,剩下的全部作为训练集,这种方法得出的结果与训练整个测试集的期望值最为接近,但是成本过于庞大。
我们用SKlearn库来实现一下LOO
from sklearn.model_selection import LeaveOneOut# 一维示例数据
data_dim1 = [1, 2, 3, 4, 5]
# 二维示例数据
data_dim2 = [[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4],
[5, 5, 5, 5]]
loo = LeaveOneOut() # 实例化LOO对象
# 取LOO训练、测试集数据索引
for train_idx, test_idx in loo.split(data_dim1):
# train_idx 是指训练数据在总数据集上的索引位置
# test_idx 是指测试数据在总数据集上的索引位置
print("train_index: %s, test_index %s" % (train_idx, test_idx))
# 取LOO训练、测试集数据值
for train_idx, test_idx in loo.split(data_dim1):
# train_idx 是指训练数据在总数据集上的索引位置
# test_idx 是指测试数据在总数据集上的索引位置
train_data = [data_dim1[i] for i in train_idx]
test_data = [data_dim1[i] for i in test_idx]
print("train_data: %s, test_data %s" % (train_data, test_data))
data_dim1的输出:
train_index: [1 2 3 4], test_index [0]
train_index: [0 2 3 4], test_index [1]
train_index: [0 1 3 4], test_index [2]
train_index: [0 1 2 4], test_index [3]
train_index: [0 1 2 3], test_index [4]train_data: [2, 3, 4, 5], test_data [1]
train_data: [1, 3, 4, 5], test_data [2]
train_data: [1, 2, 4, 5], test_data [3]
train_data: [1, 2, 3, 5], test_data [4]
train_data: [1, 2, 3, 4], test_data [5]
data_dim2的输出:
train_index: [1 2 3 4], test_index [0]
train_index: [0 2 3 4], test_index [1]
train_index: [0 1 3 4], test_index [2]
train_index: [0 1 2 4], test_index [3]
train_index: [0 1 2 3], test_index [4]train_data: [[2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5]], test_data [[1, 1, 1, 1]]
train_data: [[1, 1, 1, 1], [3, 3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5]], test_data [[2, 2, 2, 2]]
train_data: [[1, 1, 1, 1], [2, 2, 2, 2], [4, 4, 4, 4], [5, 5, 5, 5]], test_data [[3, 3, 3, 3]]
train_data: [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [5, 5, 5, 5]], test_data [[4, 4, 4, 4]]
train_data: [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]], test_data [[5, 5, 5, 5]]
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。