机器学习模型训练测试完整步骤

文章的目的:这篇文章主要讲述模型的建立、以及测试的完整步骤,重点是各个步骤的关系以及作用。
文章的前提:这篇文章所有代码是用python编写,用knn算法对经典数据MNIST data(手写数字)进行建立模型。这是用一个实例说明,不用太在乎算法和数据本身。
文章结构:文章会解释每一步的作用,最后会贴出全部python代码,本文的数据下载地址:这里写链接内容

一、读取数据(原始数据)
读取数据可以看做数据收集,原始数据的状态。这里是csv文件,具体读取方式有很多,这里采用pandas的方法。

def opencsv():  # 使用pandas打开
    data = pd.read_csv('data/train.csv')
    data1 = pd.read_csv('data/test.csv')
    train_x = data.values[0:, 1:]  # 读入全部训练数据
    train_y = data.values[0:, 0]
    result_x = data1.values[0:, 0:]  # 测试全部测试个数据
    return train_x, train_y, result_x

二、数据预处理
数据预处理处理是对数据提前进行处理和修正。主要包括:特征提取,特征降维、特征空值处理、特征转换(one-hot)、特征归一化;目标值空值处理,目标值转换(one-hot)
(其中常用的是:降维、空值、one-hot转换、归一化。)
(这里我的数据没有经过预处理,因为原始的数据是图片像素数据,具体每一种数据在sklearn上都有方法)

三、交叉验证数据划分
为了模型测试,先选择交叉验证方法,提前划分好数据。
(注意:交叉验证会改变数据顺序,若原始数据对你有用,可以先进行交叉验证,在进行降维等预处理,接下来会演示)

def data_pro(x,y):
    x_train, x_test, y_train, y_test = train_test_split(x, y,test_size=0.1,random_state=33)
    return x_train, x_test, y_train, y_test

四、模型建立及测试
用处理好的数据建立训练模型,对模型的评价有很多参数,常用的有:得分(对的比例)、查准率、查全率、F1指数

    #训练
    knnClf = KNeighborsClassifier()  # k=5   KNN中邻值为5,
    knnClf.fit(x_train, ravel(y_train))

    #预测
    y_predict = knnClf.predict(x_test)
    print("score on the testdata:",knnClf.score(x_test,y_test))
    # print("score on the traindata:",knnClf.score(x_train,y_train))
    print(classification_report(y_test,y_predict))

五、预测的可能性计算
计算分类的概率大小

    # 可能性
    probablity = knnClf.predict_proba(x_test)
    list_pro = []
    for i in range(probablity.shape[0]):
        pro = max(list(probablity[i]))
        list_pro.append(pro)

六、结果保存
将编号,原始结果,预测结果,预测概率保存csv

    #输出
    index = np.array(id).reshape((-1,1))[:,0:1]
    result = pd.DataFrame(np.column_stack((index.reshape(-1,1),np.array(y_test).reshape(-1,1),np.array(y_predict).reshape(-1,1),np.array(list_pro).reshape(-1,1))),
                          columns=['ImageId','test_label','predict_lable','probablity'])
    result.to_csv('result/knn_result.csv',index=False,header=True,encoding='gbk')

七、错误分析
错误本身就是一个很重要的东西,将错误分类保存起来。当需要对具体错误类型分析的时候,可以逐个分析错误。(比如当对‘4’分类错误比价多的时候,可以加大‘4’的权重,使得其充分训练)

    #错误分析
    diff_index = []
    for i in range(result.shape[0]):
        diff_index.append(result['test_label'][i] != result['predict_lable'][i])
    print(diff_index)
    diff = result[diff_index]
    diff_x = x_test_original[diff_index]

    #查看每个错误
    for i in range(len(diff_index)):
        # print("label is:",diff['test_label'][i],"predict is:",diff['predict_lable'][i])
        print("test label is :",diff.iloc[i]['test_label'],'predict label is :',diff.iloc[i]['predict_lable'])
        x = diff_x[i]
        img = x.reshape(28,28)
        image_show(img)

    diff.to_csv('result/knn_result_diff.csv',index=False,header=True,encoding='gbk')

全部代码:

import pandas as pd
import time
from numpy import ravel, savetxt
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

def image_show(img):
    plt.imshow(img)
    plt.show()

def opencsv():  # 使用pandas打开
    data = pd.read_csv('data/train.csv')
    data1 = pd.read_csv('data/test.csv')
    train_x = data.values[0:, 1:]  # 读入全部训练数据
    train_y = data.values[0:, 0]
    result_x = data1.values[0:, 0:]  # 测试全部测试个数据
    return train_x, train_y, result_x

def data_pro(x,y):
    x_train, x_test, y_train, y_test = train_test_split(x, y,test_size=0.1,random_state=33)
    return x_train, x_test, y_train, y_test

def knnClassify(x_train, x_test, y_train, y_test):
    id = range(1,x_test.shape[0]+1)
    print("start run knn.")
    #训练
    knnClf = KNeighborsClassifier()  # k=5   KNN中邻值为5,
    knnClf.fit(x_train, ravel(y_train))

    #预测
    y_predict = knnClf.predict(x_test)
    print("score on the testdata:",knnClf.score(x_test,y_test))
    # print("score on the traindata:",knnClf.score(x_train,y_train))
    print(classification_report(y_test,y_predict))
    # 可能性
    probablity = knnClf.predict_proba(x_test)
    list_pro = []
    for i in range(probablity.shape[0]):
        pro = max(list(probablity[i]))
        list_pro.append(pro)
    #输出
    index = np.array(id).reshape((-1,1))[:,0:1]
    result = pd.DataFrame(np.column_stack((index.reshape(-1,1),np.array(y_test).reshape(-1,1),np.array(y_predict).reshape(-1,1),np.array(list_pro).reshape(-1,1))),
                          columns=['ImageId','test_label','predict_lable','probablity'])
    result.to_csv('result/knn_result.csv',index=False,header=True,encoding='gbk')

    #错误分析
    diff_index = []
    for i in range(result.shape[0]):
        diff_index.append(result['test_label'][i] != result['predict_lable'][i])
    print(diff_index)
    diff = result[diff_index]
    diff_x = x_test_original[diff_index]

    #查看每个错误
    for i in range(len(diff_index)):
        # print("label is:",diff['test_label'][i],"predict is:",diff['predict_lable'][i])
        print("test label is :",diff.iloc[i]['test_label'],'predict label is :',diff.iloc[i]['predict_lable'])
        x = diff_x[i]
        img = x.reshape(28,28)
        image_show(img)

    diff.to_csv('result/knn_result_diff.csv',index=False,header=True,encoding='gbk')

def svmClassify(train_x, train_y, test_x):
    id = range(1, 28001)
    t = time.time()
    svc = svm.SVC(kernel='rbf', C=10)
    svc.fit(train_x, train_y)
    h = time.time()
    print('time used:%f' % (h - t))
    test_y = svc.predict(test_x)
    k = time.time()

    print('time used:%f' % (k - h))
    savetxt('sklearn_svm_Result.csv', test_y, delimiter=',')
    result = pd.DataFrame(np.column_stack((np.array(id).reshape((-1, 1))[:, 0:1], np.array(test_y).reshape((-1, 1))[:, 0:1])),
                          columns=['ImageId', 'Label'])

    result.to_csv("sklearn_knn_Result2.csv", index=False, header=True, encoding='gbk')


if __name__ == "__main__":
    print("start.")
    #原数据
    train_x_original, train_y_original, result_x_original = opencsv()
    # 交叉验证
    x_train_original, x_test_original, y_train, y_test = data_pro(train_x_original, train_y_original)
    # 降维
    pca = PCA(n_components=0.8, whiten=True)
    train_x_pca = pca.fit_transform(x_train_original)
    x_test_pca = pca.transform(x_test_original)
    result_x_pca = pca.transform(result_x_original)
    #knn
    knnClassify(train_x_pca, x_test_pca, y_train, y_test)
    #SVM
    # svmClassify(train_x,train_y,test_x)
    print("end.")
  • 31
    点赞
  • 198
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
机器学习实验报告完整 机器学习实验报告完整全文共25页,当前为第1页。机器学习实验报告完整全文共25页,当前为第1页。 机器学习实验报告完整全文共25页,当前为第1页。 机器学习实验报告完整全文共25页,当前为第1页。 基于AutoEncoder原理和L_BFGS优化算法实现手写数字识别 机器学习实验报告完整全文共25页,当前为第2页。机器学习实验报告完整全文共25页,当前为第2页。 机器学习实验报告完整全文共25页,当前为第2页。 机器学习实验报告完整全文共25页,当前为第2页。 目录 1 神经网络基本概念 3 1.1概述 3 1.2 神经网络模型 4 2 AutoEncoder原理 5 2.1 反向传播算法 5 2.2 Softmax回归 7 2.3 Stacked AutoEncoder 8 2.4 微调过程 9 2.5 Sparse AutoEncoder 9 2.6 Denoise AutoEncoder 10 3 L_BFGS算法 11 3.1基本原理 11 3.2算法流程 15 3.3算法收敛性分析: 18 4 基于AutoEncoder的手写数字识别 18 4.1 MNIST数据库 18 4.2 模型训练 19 4.3 模型测试 19 5 实验结果及分析: 19 5.1 AutoEncoder 20 5.2 Sparse AutoEncoder 20 5.3 Denoise AutoEncoder 21 5.4 实验结果汇总及分析 22 6 参考资料 24 机器学习实验报告完整全文共25页,当前为第3页。机器学习实验报告完整全文共25页,当前为第3页。AutoEncoder实现手写数字识别 机器学习实验报告完整全文共25页,当前为第3页。 机器学习实验报告完整全文共25页,当前为第3页。 1 神经网络基本概念 1.1概述 神经网络是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 神经网络由多个神经元构成,下图就是单个神经元的图1所示: 图1 神经元模型 这个神经元是以以及截距为输入值的运算单元,其输出为,其中函数被称作"激活函数"。在本次试验中,我们选用sigmoid函数作为激活函数 图2 sigmoid函数图像 机器学习实验报告完整全文共25页,当前为第4页。机器学习实验报告完整全文共25页,当前为第4页。1.2 神经网络模型 机器学习实验报告完整全文共25页,当前为第4页。 机器学习实验报告完整全文共25页,当前为第4页。 神经网络就是将许多个单一的神经元联结在一起,这样,一个神经元的输出就可以是另一个神经元的输入。例如,下图就是一个简单的神经网络: 图3 神经网络示意图 我们用第层第单元的激活值(输出值)。当时,,也就是第个输入值。对于给定的参数集合,神经网络就可以按照函数来计算输出结果。以上述模型为例,计算步骤如下: 我们用表示第第层第单元输入加权和(包括偏置),这样我们对上式就可以得到一种更加简洁的表示法: 上述的计算步骤叫作前向传播。给定第层的激活值后,第层的激活值就可以按照下面步骤计算得到: 机器学习实验报告完整全文共25页,当前为第5页。机器学习实验报告完整全文共25页,当前为第5页。2 AutoEncoder原理 机器学习实验报告完整全文共25页,当前为第5页。 机器学习实验报告完整全文共25页,当前为第5页。 2.1 反向传播算法 自编码(AutoEncoder)神经网络是一种无监督的学习算法,它使用了反向传播算法,让目标值等于输入值,例如输入值为训练样本集合,则我们的输出值。下图是一个自编码神经网络的示例: 图4 单隐层神经网络 自编码神经网络的主要参数是连接权重和偏置,我们尝试利用自编码神经网络学习一个,也就是说我们尝试逼近一个恒等函数,从而使得输出接近于输入。假设我们有一个固定样本集,它包含个样例。对于单个样例,其代价函数为: 这是一个方差代价函数。给定一个包含个样例的数据集,我们可以定义整体代价函数为: 机器学习实验报告完整全文共25页,当前为第6页。机器学习实验报告完整全文共25页,当前为第6页。 机器学习实验报告完整全文共25页,当前为第6页。 机器学习实验报告完整全文共25页,当前为第6页。 以上公式中的第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。 我们的目标是针对参数和来求其函数的最小值。为了求解神经网络,我们将每一个参数和初始化为一个很小的、接近于0的随机数,之后对目标函数求最优解。 梯度下降法中每一次迭代都是按照如下公式对参数和进行更新: 其中是学习速率。更新参数和的关键步骤是计算偏导数。而反向传播算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值