【问题标题】:Transforming the prediction target变换预测目标
【发布时间】:2018-08-15 05:31:48
【问题描述】:

我有一个数据集,其中每个观察结果可能属于不同的标签(多标签分类)。

我已经对其及其工作进行了 SVM 分类。 (这里我对查看每个类的准确性很感兴趣,所以我为每个类应用了OneVsRestClassifier,正如您将在代码中看到的那样。)

我想查看测试数据中每个项目的预测值。换句话说,我想看看模型在测试样本中的每次观察预测了哪个标签。

例如: 这是传递给模型进行预测的数据

,sentences,ADR,WD,EF,INF,SSI,DI,others
0,"extreme weight gain, short-term memory loss, hair loss.",1,0,0,0,0,0,0
1,I am detoxing from Lexapro now.,0,0,0,0,0,0,1
2,I slowly cut my dosage over several months and took vitamin supplements to help.,0,0,0,0,0,0,1
3,I am now 10 days completely off and OMG is it rough.,0,0,0,0,0,0,1
4,"I have flu-like symptoms, dizziness, major mood swings, lots of anxiety, tiredness.",0,1,0,0,0,0,1
5,I have no idea when this will end.,1,0,0,0,0,0,1

那么我的模型已经预测了这些行的标签,我想查看每一行的预测映射。

我知道我们可以在 scikit-learn 库中使用 Label Binarization 来做到这一点。

问题是fit_transform 的输入参数解释here 与我准备并传递给SVM 分类的目标数据不同。 所以我不知道如何弄清楚。

这是我的代码:

df = pd.read_csv("finalupdatedothers.csv")
categories = ['ADR','WD','EF','INF','SSI','DI','others']

train,test = train_test_split(df,random_state=42,test_size=0.3,shuffle=True)
X_train = train.sentences
X_test = test.sentences

SVC_pipeline = Pipeline([
                ('tfidf', TfidfVectorizer(stop_words=stop_words)),
                ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
            ])

for category in categories:
    print('... Processing {} '.format(category))
    SVC_pipeline.fit(X_train,train[category]
    prediction = SVC_pipeline.predict(X_test)
    print('SVM Linear Test accuracy is {} '.format(accuracy_score(test[category], prediction)))
    print 'SVM Linear f1 measurement is {} '.format(f1_score(test[category], prediction, average='weighted'))
    print "\n"

感谢您的宝贵时间。

【问题讨论】:

  • 你的意思是说要知道prediction变量指定的标签?
  • @user2906838 感谢您的评论。我的意思是,如果在测试数据中有一行像“我讨厌这种药”,那么我的模型预测为 ADR。所以我想查看所有测试数据的映射。我说清楚了吗?
  • 哦,是的,很抱歉,您能否分享一个 yoru csv 样本,以便重新生成您的输出。我也许能帮上忙。
  • 当然感谢您的帮助:)
  • 您现在能检查一下该数据是否有效吗?但是想象一下,当我们通过测试时,测试数据不会有标签

标签: python machine-learning scikit-learn multilabel-classification


【解决方案1】:

这就是你想要的,我刚刚做的是,我映射了prediction,这是一个 numpy 数组,表示你的categories 列表中的类标签索引。所以这里是完整的代码。

import pandas as pd
import numpy as np
from sklearn import svm
from sklearn.datasets import samples_generator
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.multiclass import OneVsRestClassifier

from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.metrics import f1_score
df = pd.read_csv("finalupdatedothers.csv")
categories = ['ADR','WD','EF','INF','SSI','DI','others']

train,test = train_test_split(df,random_state=42,test_size=0.3,shuffle=True)
X_train = train.sentences
X_test = test.sentences

SVC_pipeline = Pipeline([
                ('tfidf', TfidfVectorizer(stop_words=[])),
                ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
            ])


for category in categories:
    print('... Processing {} '.format(category))
    SVC_pipeline.fit(X_train,train[category])
    prediction = SVC_pipeline.predict(X_test)
    print([{X_test.iloc[i]:categories[prediction[i]]} for i in range(len(list(prediction)))  ])

    print('SVM Linear Test accuracy is {} '.format(accuracy_score(test[category], prediction)))
    print ('SVM Linear f1 measurement is {} '.format(f1_score(test[category], prediction, average='weighted')))
    print ("\n")

这是示例输出:

... Processing ADR 
[{'extreme weight gain, short-term memory loss, hair loss.': 'ADR'}, {'I am detoxing from Lexapro now.': 'ADR'}]
SVM Linear Test accuracy is 0.5 
SVM Linear f1 measurement is 0.3333333333333333 


... Processing WD 
[{'extreme weight gain, short-term memory loss, hair loss.': 'ADR'}, {'I am detoxing from Lexapro now.': 'ADR'}]
SVM Linear Test accuracy is 1.0 
SVM Linear f1 measurement is 1.0 

我希望这会有所帮助。

【讨论】:

  • 为什么会出现奇怪的错误! tz=getattr(series.dtype, 'tz', None)) 文件“pandas_libs\index.pyx”,第 106 行,在 pandas._libs.index.IndexEngine.get_value 文件“pandas_libs\index.pyx”,第 114 行,在pandas._libs.index.IndexEngine.get_value 文件“pandas_libs\index.pyx”,第 162 行,在 pandas._libs.index.IndexEngine.get_loc 文件“pandas_libs\hashtable_class_helper.pxi”,第 958 行,在 pandas._libs.hashtable。 Int64HashTable.get_item 文件“pandas_libs\hashtable_class_helper.pxi”,第 964 行,在 pandas._libs.hashtable.Int64HashTable.get_item KeyError: 0L
  • 我可以知道你的熊猫版本吗?
  • 它是 0.22.0 。根据错误,您的数据中没有密钥 OL
  • no 0L 在我的数据中没有意义。我想它与此链接有关stackoverflow.com/questions/45087247/… 我可以知道您的 df 中的索引类型是什么吗?
  • ,sentences,ADR,WD,EF,INF,SSI,DI,others 这就是我所拥有的
猜你喜欢
  • 1970-01-01
  • 2014-04-25
  • 2014-03-03
  • 1970-01-01
  • 2018-11-29
  • 2015-11-24
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多