我试图使用scikit-learn做一些分类。但是,我很难立即开始并导入数据。
我正在处理这些数据:Adult Data Set。
我是numpy和scikit-learn的新手,所以我开始关注使用this tutorial的Wine dataset。
我遇到的问题是数据是作为元组的一维数组而不是二维数组导入的。还有缺失的数据,由?
表示。
我的数据集不完全是数字。有很多字符串。我阅读了genfromtxt doc,其中有一些如何处理混合类型数据集的示例。 (可能有更好的方法来解决这个问题,而不是我在下面使用的方法吗?)
这是我的代码:
import numpy as np
all_data = np.genfromtxt(open("./adult.data","r"), dtype=[
('age', 'i4'),
('workclass', 'S16'),
('fnlwgt', 'i8'),
('education', 'S12'),
('education_num', 'i4'),
('marital_status', 'S22'),
('occupation', 'S17'),
('relationship', 'S14'),
('race', 'S18'),
('sex', 'S6'),
('capital_gain', 'i8'),
('capital_loss', 'i8'),
('hours_per_week', 'i4'),
('native_country', 'S26'),
('income', 'S5')
],
delimiter=",", autostrip=True,
missing_values=('?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?'))
# load class labels from column 15
y_adult_labels = all_data['income']
# load the 14 features
X_adult = all_data[:][0:-1]
这是创建一元组的元组,其中每个元组都是原始CSV数据文件中的一行。
为什么这不会创建2D数组? (首先,像all_data[:,1:]
这样的内容会产生IndexError: too many indices for array
。)
我最终想:
converters
调用中使用genfromtxt
?答案 0 :(得分:3)
2D数组必须在所有单元格中具有相同类型的内容。但是根据您自己的规范(dtype),您正在加载数字和字符串的混合。
这是一种不同类型的2D数组,一种结构化数组。您可以按编号索引“行”,按名称索引“列”,例如all_data['income']
。那些'元组'(不是真正的元组,但它们以这种方式显示)是结构化数组,相当于2D数组行。
如果您确实必须按编号访问字段,请从dtype.names
列表中索引名称。
阅读结构化(有时称为记录)数组。
为什么genfromtxt
返回1d数组的问题已被多次询问。
至于转换为纯数字数据,我认为你必须按列工作列(字段)。制作另一个数组newdata=np.empty((n,15),dtype=int)
。取all_data['workclass']
,将字符串映射到数字,然后将其分配给newdata[:,1]=...
等。没有魔法或捷径。