一、判断机器学习算法的性能
- 机器学习经过训练得到的模型,其意义在于真实环境中的使用;
- 将全部的原始数据当做训练集直接训练出模型,然后投入到真实环境中,这种做法是不恰当的,存在问题:
- 如果模型效果很差,没有机会通过实际调试就直接应用到实际当中,怎么办?(# 实例:股市预测)
- 在真实环境中,开发者难以拿到真实label(输出结果),则无从得知模型的效果?(# 实例:银行发放信用卡)
- 方案:训练数据集与测试数据集切分(train test split),将原始数据的80%作为训练数据来训练模型,另外20%作为测试数据,通过测试数据直接判断模型的效果,在模型进入真实环境前改进模型;
# 此方案(训练数据集与测试数据集切分)也存在问题:待补充。。。
# 测试机器学习算法的模型,目的是优选出效果更好的模型;
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
- 方法二:将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:, :],测试数据集
np.random.permutation(100):将0~100个数随机排列;# permutation()只接受一个参数;
- 由于对indexes的乱序处理带有随机性,如果想再次查看历史数据,可设定随机种子,得到历史随机数;
2)使用我们的算法:
# 导入模块、传入原始数据、将预测结果与真实结果对比(相等得到布尔数组)得到准确度;