我想使用sci-kit learn分析模型错误分类的数据,这样我就可以改进我的特征生成。我有一个方法可以做到这一点,但我对sci试剂盒和熊猫都是新手,所以我想知道是否有更有效/直接的方法来实现这一点。这似乎是标准工作流程的一部分,但在我所做的研究中,我没有发现任何东西可以直接解决从模型分类到特征矩阵到原始数据的向后映射问题。
以下是我正在使用的上下文/工作流,以及我设计的解决方案。下面是示例代码。
上下文。我的工作流程如下:
- 从一堆JSON Blob(原始数据)开始。这是熊猫DataFrame
- 提取建模的相关部分,称之为数据。这是熊猫数据帧
- 此外,我们有所有数据的真值数据,所以我们称之为真值或y
- 在sci-kit learn中创建一个特征矩阵,称之为X。这是一个大型稀疏矩阵
- 创建一个随机林对象,调用此林
- 使用sci-kit learn split_train_test()函数创建用于训练和测试的特征矩阵的随机子集
- 在上面的训练数据X_Train上训练森林,X_Train是一个大的稀疏矩阵
- 获取假阳性和假阴性结果的索引。这些是X_test(一个稀疏矩阵)的索引
- 从一个假阳性索引到X_test返回到原始数据
- 如有必要,请从数据转到原始数据
解决方案。
- 将索引数组传递到split_test_train()函数中,该函数将对索引数组应用相同的随机化器,并将其作为训练和测试数据的索引返回(idx_test)
- 收集假阳性和假阴性的索引,这些是nd.arrays
- 使用这些来查找索引数组中的原始位置,例如,对于false_neg数组中的false_example,index=idx_test[fals_example]
- 使用该索引查找原始数据,data。iloc[index]是原始数据
- 如果需要,data.index[index]将把索引值返回到原始数据中
以下是与使用tweet的示例相关联的代码。同样,这是有效的,但有更直接/更聪明的方法吗?
# take a sample of our original data
data=tweet_df[0:100]['texts']
y=tweet_df[0:100]['truth']
# create the feature vectors
vec=TfidfVectorizer(analyzer="char",ngram_range=(1,2))
X=vec.fit_transform(data) # this is now feature matrix
# split the feature matrix into train/test subsets, keeping the indices back into the original X using the
# array indices
indices = np.arange(X.shape[0])
X_train, X_test, y_train, y_test,idx_train,idx_test=train_test_split(X,y,indices,test_size=0.2,random_state=state)
# fit and test a model
forest=RandomForestClassifier()
forest.fit(X_train,y_train)
predictions=forest.predict(X_test)
# get the indices for false_negatives and false_positives in the test set
false_neg, false_pos=tweet_fns.check_predictions(predictions,y_test)
# map the false negative indices in the test set (which is features) back to it's original data (text)
print "False negatives: n"
pd.options.display.max_colwidth = 140
for i in false_neg:
original_index=idx_test[i]
print data.iloc[original_index]
检查预测功能:
def check_predictions(predictions,truth):
# take a 1-dim array of predictions from a model, and a 1-dim truth vector and calculate similarity
# returns the indices of the false negatives and false positives in the predictions.
truth=truth.astype(bool)
predictions=predictions.astype(bool)
print sum(predictions == truth), 'of ', len(truth), "or ", float(sum(predictions == truth))/float(len(truth))," match"
# false positives
print "false positives: ", sum(predictions & ~truth)
# false negatives
print "false negatives: ",sum( ~predictions & truth)
false_neg=np.nonzero(~predictions & truth) # these are tuples of arrays
false_pos=np.nonzero(predictions & ~truth)
return false_neg[0], false_pos[0] # we just want the arrays to return
您的工作流程是:
原始数据->特征->分割->训练->预测->标签上的错误分析
预测和特征矩阵之间存在行对行的对应关系,所以如果你想对特征进行误差分析,应该没有问题。如果您想查看哪些原始数据与错误相关,则必须对原始数据进行拆分,或者跟踪哪些数据行映射到哪些测试行(您当前的方法)。
第一个选项看起来像:
在原始数据上拟合变压器->拆分原始数据->单独转换训练/测试->训练/测试>>
也就是说,它在拆分前使用fit
,在拆分后使用transform
,使原始数据以与标签相同的方式进行分区。