使用 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 并定义了trainingtesting,如上所述。在定义 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 数据框

如何将此 scikit-learn 部分转换为 pandas 数据框? [复制]

使用带有 Pandas DataFrame 的 Scikit-Learn OneHotEncoder

如何将数据从 Scikit-learn Bunch 对象转换为 Pandas DataFrame?

使用 pandas 和 scikit-learn 对多维数组进行 one-hot 编码