在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”。python有现成的模块,完整代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
# 随机抽样
def read_data(data_file,label,start,test_size,random_state):
#label 分类变量所在列号,如第二列是2;start,分类用的指标开始列号;random_state,随机种子
dataset = pd.read_csv(data_file)
train_data= dataset.iloc[:,(start-1):].values
train_target = dataset.iloc[:,(label-1):label]
train_x,test_x,train_y,test_y = train_test_split(train_data,train_target,test_size=test_size,random_state=random_state)
return train_x, train_y, test_x, test_y,dataset
if __name__ == '__main__':
data_file = "/data/for_python.csv"
out_dir="/data/models_pipline"
test_size = 0.3 #测试集合占30%
random_state=5 #随机种子 为5
print('reading training and testing data...')
train_x, train_y, test_x, test_y,dataset = read_data(data_file,2,3,test_size,random_state)
print(' training and testing data done !')
##############
测试的数据有8个分类,每个分类数据量不均等,总样本数600+,抽取后各个分类用于测试的样本占比。
缺点:多分类随机抽取会有一定的偏差,不是每一个类别都是占该类别的30%,当样本量较少时这种抽取比例的偏差就会产生较大的影响。
解决方法:分层抽取,分层抽取的代码:
train_x,test_x,train_y,test_y = train_test_split(train_data,train_target,test_size=test_size,random_state=random_state,stratify=train_target)
## 其实就是增加了一个参数,stratify ,在发现这个参数前,自己参考网上的资料也写了一个函数,写完发现还能这样,伤心。。。。
网友评论