自定义十折交叉验证

本文是《Python数据分析与挖掘》中第六章的补充代码

# 1> 数据划分 取20%做测试样本,剩下做训练样本

import pandas as pd
import numpy as np


dt = pd.read_excel('model.xls')
simpler = np.random.permutation(len(dt))
dt = dt.take(simpler) #导入随机函数shuffle,用来打乱数据 注意:不能用shuffle
dt = dt.as_matrix() #将表格转成矩阵格式
# 2> 十折决策树算法
from sklearn.tree import DecisionTreeClassifier #导入决策树模型
from __future__ import division
from sklearn.metrics import confusion_matrix
p = 0.1 #设置训练集的比例
N = 1/p
correctRate = []
for i in range(int(N)):
    demotest = dt[int(len(dt)*(p*i)):int(len(dt)*(p*(i+1))), :]
    demotrain = np.row_stack((dt[:int(len(dt)*(p*i)), :], dt[int(len(dt)*(p*(i+1))):, :]))
    
    tree = DecisionTreeClassifier() # 建立决策树模型
    tree.fit(demotrain[:,:3], demotrain[:,3]) #训练模型
    
    predict_CartResult = tree.predict(demotest[:,:3]) # 测试模型
    cm = confusion_matrix(demotest[:,3], predict_CartResult)
    cRate = (cm[1,1] + cm[0,0]) / cm.sum()
    correctRate.append(cRate)
print sum(correctRate)/len(correctRate) # 求这是个正确率的均值 #predict_classes(随数据集的组合而变化)
#  3> 十折LM神经网络
# #构建LM神经网络模型
from keras.models import Sequential #导入神经网络初始化函数
from keras.layers.core import Dense, Activation #导入神经网络层函数、激活函数
from __future__ import division
from sklearn.metrics import confusion_matrix

p = 0.1 #设置训练集的比例
N = 1/p
correctRateLM = []
for i in range(int(N)):
    demotest = dt[int(len(dt)*(p*i)):int(len(dt)*(p*(i+1))), :]
    demotrain = np.row_stack((dt[:int(len(dt)*(p*i)), :], dt[int(len(dt)*(p*(i+1))):, :]))
    
    net = Sequential() # 建立神经网络
    net.add(Dense(input_dim = 3, output_dim = 10)) # 添加输入层(3节点)到隐藏层(10节点)的连接
    net.add(Activation('relu')) # 隐藏层使用relu激活函数(通过实验确定的relu函数)
    net.add(Dense(input_dim = 10, output_dim = 1)) # 添加隐藏层(10节点)到输出层(1节点)的连接
    net.add(Activation('sigmoid')) # 输出层使用sigmoid激活函数
    net.compile(loss = 'binary_crossentropy', optimizer = 'adam',metrics=None)#编译模型,用adam方法求解
    net.fit(demotrain[:,:3], demotrain[:,3], nb_epoch=1000, batch_size=1)# 训练模型,循环1000次
    
    predict_result = net.predict_classes(demotest[:,:3]).reshape(len(demotest)) #预测结果变形,预测结果都是nx1维数组
    cm = confusion_matrix(demotest[:,3],predict_result)
    cRate = (cm[1,1] + cm[0,0]) / cm.sum()
    correctRateLM.append(cRate)
print sum(correctRateLM)/len(correctRateLM) # 求这是个正确率的均值


猜你喜欢

转载自blog.csdn.net/u012063773/article/details/79327301