:param algorihm: 传入算法的类 :param X: 特征集 :param y: 结果集 :param n: 划分个数 :return:
(algorihm, X, y, n, isReg)
| 23 | return X_train, X_test, y_train, y_test |
| 24 | |
| 25 | def cross_validation(algorihm, X, y, n, isReg): #交叉验证法 |
| 26 | """ |
| 27 | :param algorihm: 传入算法的类 |
| 28 | :param X: 特征集 |
| 29 | :param y: 结果集 |
| 30 | :param n: 划分个数 |
| 31 | :return: |
| 32 | """ |
| 33 | def accuracy_score(y_true, y_predict): # 计算准确率 |
| 34 | |
| 35 | if(isReg) : |
| 36 | return np.sqrt(np.sum(np.power(y_true - y_predict, 2.0)) / len(y_true)) |
| 37 | else : |
| 38 | return np.sum(y_true == y_predict) / len(y_true) |
| 39 | all = np.random.permutation(len(X)) #打乱索引 |
| 40 | size = len(X) // n |
| 41 | # 根据n把数据分成n部分 |
| 42 | s = [] |
| 43 | for i in range(0, len(X), size): |
| 44 | a = all[i:i+size] |
| 45 | s.append(a) |
| 46 | result = np.empty((n,)) # 记录准确率 |
| 47 | |
| 48 | # 遍历s,交叉验证过程 |
| 49 | for i in range(n): |
| 50 | b = copy.deepcopy(s) |
| 51 | verify = b.pop(i) # 弹出一个元素做验证集 |
| 52 | train = np.hstack(b) # 其他元素合并做训练集 |
| 53 | # 根据索引找元素 |
| 54 | verify_real_X = np.array([X[j] for j in verify]) |
| 55 | verify_real_y = np.array([y[j] for j in verify]) |
| 56 | train_real_X = np.array([X[j] for j in train]) |
| 57 | train_real_y = np.array([y[j] for j in train]) |
| 58 | # 代入验证类 |
| 59 | algorihm.fit(train_real_X, train_real_y) |
| 60 | verify_predict = algorihm.predict(verify_real_X) #计算预测值 |
| 61 | result[i] = accuracy_score(verify_real_y, verify_predict) # 计算准确率 |
| 62 | return np.mean(result) # 准确率求均值返回 |
| 63 | |
| 64 | def bootstraping(X, y): #自助法 |
| 65 | """ |
no test coverage detected