使用 Pandas 为 Scikit-Learn 准备 CSV 文件数据?
Posted
技术标签:
【中文标题】使用 Pandas 为 Scikit-Learn 准备 CSV 文件数据?【英文标题】:Preparing CSV file data for Scikit-Learn Using Pandas? 【发布时间】:2016-07-15 09:06:59 【问题描述】:我有一个没有标题的 csv 文件,我正在使用 pandas 将其导入 python。最后一列是目标类,其余列是图像的像素值。如何继续使用 pandas (80/20) 将此数据集拆分为训练集和测试集?
此外,一旦完成,我将如何拆分这些集合中的每一个,以便我可以定义 x(除最后一列之外的所有列)和 y(最后一列)?
我已使用以下方式导入我的文件:
dataset = pd.read_csv('example.csv', header=None, sep=',')
谢谢
【问题讨论】:
你尝试过 Pandas 中的sample
函数吗:pandas.pydata.org/pandas-docs/stable/generated/…?
【参考方案1】:
你可以这样做:
choices = np.in1d(dataset.index, np.random.choice(dataset.index,int(0.8*len(dataset)),replace=False))
training = dataset[choices]
testing = dataset[np.invert(choices)]
然后,将其作为 x 和 y 传递给 Scikit-Learn:
scikit_func(x=training.iloc[:,0:-1], y=training.iloc[:,-1])
如果这不起作用,请告诉我。
【讨论】:
感谢卡提克。我导入了numpy as np
并定义了training
和testing
,如上所述。在定义 testing
时出现以下错误:line 2765, in _evaluate_compare raise ValueError('Lengths must match to compare') ValueError: Lengths must match to compare
抱歉这个错误,我忘记了training
的行数比dataset
少,这导致了错误。这次我测试了代码,它应该可以工作。再次道歉。
嗯 X 是说有 0 列而不是正确的数量应该是 1024 ([3173 rows x 0 columns]
)。
使用.iloc
而不是.ix
,就像在编辑后的答案中一样。
感谢 Kartik 绝对解决了问题。话虽如此,我将接受@ayhan 的回答,因为他确实建议使用 sklearn 的交叉验证功能来拆分数据,这在我看来是最好的方法,而且他对 .ix 的使用似乎更合适。不过感谢您的帮助!【参考方案2】:
你可以试试这个。
从其余部分分离目标类:
pixel_values = Dataset[df.columns[0:len(Dataset.axes[1])-1]]
target_class = Dataset[df.columns[len(Dataset.axes[1])-1:]]
现在创建测试和训练样本:
我只会使用 numpy 的 randn:
mask = np.random.rand(len(pixel_values )) < 0.8
train = pixel_values [mask]
test = pixel_values [~msk]
现在您已经在训练和测试中以 80:20 的比例训练和测试样本。
【讨论】:
感谢兰德哈瓦。我不太确定你在用 randn 和掩码做什么,但在修复了一些事情之后,我确实设法拆分了我的目标类和我的输入功能。我确实觉得使用 sklearn 的内置交叉验证拆分是一个更好的选择。 randn 正在生成介于 0 和数据帧长度(行数)之间的随机索引,并且掩码用于保留 80% 的这些随机生成的索引。【参考方案3】:我建议使用 sklearn 的 train_test_split
from sklearn.model_selection import train_test_split
# for older versions import from sklearn.cross_validation
# from sklearn.cross_validation import train_test_split
X, y = dataset.iloc[:, :-1], dataset.iloc[:, -1]
kwargs = dict(test_size=0.2, random_state=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, **kwargs)
【讨论】:
以上是关于使用 Pandas 为 Scikit-Learn 准备 CSV 文件数据?的主要内容,如果未能解决你的问题,请参考以下文章
python将scikit-learn自带数据集转换为pandas dataframe格式
如何将此 scikit-learn 部分转换为 pandas 数据框? [复制]
使用带有 Pandas DataFrame 的 Scikit-Learn OneHotEncoder