机器学习:训练数据集、测试数据集

一、判断机器学习算法的性能

  • 机器学习经过训练得到的模型,其意义在于真实环境中的使用;
  • 将全部的原始数据当做训练集直接训练出模型,然后投入到真实环境中,这种做法是不恰当的,存在问题:
  1. 如果模型效果很差,没有机会通过实际调试就直接应用到实际当中,怎么办?(# 实例:股市预测)
  2. 在真实环境中,开发者难以拿到真实label(输出结果),则无从得知模型的效果?(# 实例:银行发放信用卡)
  • 方案:训练数据集与测试数据集切分(train test split),将原始数据的80%作为训练数据来训练模型,另外20%作为测试数据,通过测试数据直接判断模型的效果,在模型进入真实环境前改进模型;

    # 此方案(训练数据集与测试数据集切分)也存在问题:待补充。。。

    # 测试机器学习算法的模型,目的是优选出效果更好的模型;

 1)将原始数据集分割为训练数据集和测试数据集:

  1. 方法一:对X和y的indexes进行乱序处理,根据乱序后的index从x和y中分割出训练数据集和测试数据集
    import numpy as np
    
    def train_test_split(X, y, test_train = 0.2, seed = None):
        """将原始数据X、y分割为X_train、y_train、X_test、y_test"""
    
        assert X.shape[0] == y.shape[0],\
            "the size of X must be equal to the size of y"
        assert 0.0 <= test_train <= 1.0,\
            "test_train must be valid"
        # seed为随机数的种子,为了两次随机数取值相同
        if seed:
            np.random.seed(seed)
        # 先对原始数据的indexes做乱序处理
        shuffle_indexes = np.random.permutation(len(X))
        # 分配训练数据和测试数据的比例和大小
        test_ratio = test_train
        test_size = int(len(X) * test_ratio)
        test_indexes = shuffle_indexes[:test_size]
        train_indexes = shuffle_indexes[test_size:]
        # 分割原始数据
        X_train = X[train_indexes]
        y_train = y[train_indexes]
    
        X_test = X[test_indexes]
        y_test = y[test_indexes]
    
        return X_train, X_test, y_train, y_test

     

  2. 方法二:将X于y相加后做乱序处理,再分离出训练数据集和测试数据集
    z = np.concatenate([X, y], axis = 1)
    np.random.shuffle(z)
    X = z[:, :4],从新排序后的原始数据x
    y = z[:, 4:],从新排序后的标签y
    train_ratio = 0.8,设置训练数据集的比例为80%
    trai_size = int(len(X) * train_ratio),训练数据集的大小
    train_data = X[:train_size, :],训练数据集
    test_data = X[train_size:, :],测试数据集

     

  3. np.random.permutation(100):将0~100个数随机排列;# permutation()只接受一个参数;

  4. 由于对indexes的乱序处理带有随机性,如果想再次查看历史数据,可设定随机种子,得到历史随机数;

 2)使用我们的算法:

  # 导入模块、传入原始数据、将预测结果与真实结果对比(相等得到布尔数组)得到准确度;

posted @ 2018-05-23 16:35  何永灿  阅读(12964)  评论(0编辑  收藏  举报