我有一个非常直截了当的问题。我正在编写一个脚本来使用Scikit-Learn库执行多标签分类。我的问题是将原始数据(采用JSON格式)转换为NumPy数组,以便与Scikit-Learn的逻辑回归分类器一起使用。我从使用Pandas中的数据知道,数据的维度应该是3369 x 76(3369个实例,76个功能)。但是,当我使用我的脚本加载JSON数据并将其转换为NumPy数组并调用data.shape
时,维度为(3369, 1077)
,因此3369个实例具有1077个功能。也许这是我不了解NumPy如何工作的东西,但如果我做错了什么并且我无意中产生了所有这些额外的功能,我担心我尝试构建的任何分类器甚至都没有由于额外功能引入噪音,有机会获得不错的表现。
所以,我的问题是两个:(1)我正在加载/转换数据以便与Scikit-Learn的分类器一起使用,以及(2)如果我正确地转换数据(据任何人都知道)原始数据和数据转换为NumPy数组后,维度之间的差异是什么原因?提前感谢您的阅读。代码如下:
编辑:我稍微削减了代码,只关注我将原始数据转换为NumPy数组的区域。
import os, json
import numpy as np
from sklearn import preprocessing, metrics
from sklearn.feature_extraction import DictVectorizer
from sklearn.cross_validation import train_test_split, KFold, cross_val_score
from sklearn.linear_model import LogisticRegression
我读了这样的原始数据:
with open('all_labels.json', 'rb') as infile:
data = json.load(infile)
现在我们有一个变量data
,它是一个Python字典列表,数据集中每个实例一个字典。
# Extract labels from data and assign to separate variable
labels = [i['label'] for i in data]
# Convert labels to numpy format for sklearn to use
le = preprocessing.LabelEncoder()
le.fit(['class1', 'class2', 'class3', 'class4'])
labels = le.transform(labels)
# Remove target labels from data instances
for i in data:
del i['label']
这是我可能出错的地方。我正在使用Scikit-Learn的DictVectorizer
尝试将字典的Python列表(其中每个字典代表数据集的一个实例,字典中的每个键都是分类器的一个特性)转换为NumPy数组。 / p>
# THIS IS WHERE I THINK MY MISUNDERSTANDING LIES
# Initialize vectorizer object to convert data instances to
# numpy format for sklearn
vec = DictVectorizer()
data = vec.fit_transform(data).toarray()
data.shape # (3369, 1077)
希望这能引导人们解决我在脚本中遇到的具体问题。