Python TF-IDF如何为机器学习生成功能?一袋文字有什么不同?

Python TF-IDF如何为机器学习生成功能?一袋文字有什么不同?,python,python-2.7,machine-learning,scikit-learn,tf-idf,Python,Python 2.7,Machine Learning,Scikit Learn,Tf Idf,我希望得到TF-IDF如何产生可用于机器学习的功能的简要解释。单词袋和TF-IDF有什么区别?我了解TF-IDF的工作原理;但不包括特征是如何用它生成的,以及这些特征是如何用于分类/回归的 我正在使用scikit学习;以下代码在理论上和实践中实际做了什么?我已经用我的理解和一些问题对其进行了评论,非常感谢您的帮助: traindata = list(np.array(p.read_table('data/train.tsv'))[:,2]) #taking in data for TF-ID

我希望得到TF-IDF如何产生可用于机器学习的功能的简要解释。单词袋和TF-IDF有什么区别?我了解TF-IDF的工作原理;但不包括特征是如何用它生成的,以及这些特征是如何用于分类/回归的

我正在使用scikit学习;以下代码在理论上和实践中实际做了什么?我已经用我的理解和一些问题对其进行了评论,非常感谢您的帮助:

  traindata = list(np.array(p.read_table('data/train.tsv'))[:,2]) #taking in data for TF-IDF, I get this
  testdata = list(np.array(p.read_table('data/test.tsv'))[:,2]) #taking in data for TF-IDF, I get this
  y = np.array(p.read_table('data/train.tsv'))[:,-1] #labels for our data

  tfv = TfidfVectorizer(min_df=3,  max_features=None, strip_accents='unicode',  
        analyzer='word',token_pattern=r'\w{1,}',ngram_range=(1, 2), use_idf=1,smooth_idf=1,sublinear_tf=1) #making tf-idf object with params to dictate how it should behave

  rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001, 
                             C=1, fit_intercept=True, intercept_scaling=1.0, 
                             class_weight=None, random_state=None) 

  X_all = traindata + testdata #adding data together
  lentrain = len(traindata) #what is this?
  tfv.fit(X_all) #is this where features are created? Are all words used as features? What happens here ?
  X_all = tfv.transform(X_all)#transforms our numpy array of text into a TF-IDF
  X = X_all[:lentrain]
  X_test = X_all[lentrain:]
  rd.fit(X,y) #train LR on newly made feature set with a feature for each word?

我猜idf是让你困惑的地方,因为单词袋是文档中单词的tf,那么为什么idf?idf是一种评估单词重要性的方法,通常情况下,文档频率(df)是评估单词在分类中的重要性的好方法,因为当一个单词出现在较少的文档中时(nba总是出现在属于体育的文档中)显示出更好的描述,因此,idf与单词的重要性正相关。

我想idf是让你感到困惑的地方,因为单词袋是文档中单词的tf,那么为什么idf呢?idf是一种评估单词重要性的方法,通常情况下,文档频率(df)是评估单词在分类中的重要性的好方法,因为当一个单词出现在较少的文档中时(nba总是出现在属于体育的文档中)显示出更好的描述,因此,idf与word的重要性正相关。

Tf idf是文档最常见的向量表示。它考虑了文本中以及整个文档语料库中单词的频率。
显然,这种方法没有科学依据,这意味着它在很多情况下都很实用,比如使用余弦距离的文档相似性或其他类型的度量,但不是从数学证明中推导出来的。

Tf idf是文档最常见的向量表示法。它考虑了文本中以及整个文档语料库中单词的频率。
显然,这种方法没有科学依据,这意味着它在很多情况下都很实用,比如使用余弦距离的文档相似性或其他类型的度量,但是不是从数学证明中推导出来的。

traindata+testdata不会连接矩阵,但会尝试对矩阵的内容求和,不要这样做。另外,不要在培训阶段使用测试数据调用
tfv.fit(X_all)
,这是一种欺骗行为,可能会隐藏过度拟合。改为:
X\u train=tfv.fit\u transform(traindata)
学习单词到特征映射(词汇表),然后使用相同的向量器实例转换测试集:
X\u test=tfv.transform(testdata)
。要连接两个稀疏矩阵,请使用
scipy.sparse.vstack([A,B])
用于垂直堆叠或
scipy.sparse.hstack([A,B])
用于水平堆叠。此代码是一个不好的用法示例,请阅读官方文档和链接示例:@SimonKiely这是一个不好的做法。通过将矢量器装配到完整的集合,您可以从测试集合中学习。对于大型训练集和小型测试集,半监督学习可能不太适合,但它在方法上仍然存在缺陷,而且成本不必要。半监督学习是指当您使用额外的未标记数据时,而不是在测试集上训练时,即使您只在测试集上训练部分模型。测试集应该模拟看不见的数据,以测试泛化性能。
traindata+testdata
不会连接矩阵,但会尝试对矩阵的内容求和,不要这样做。另外,不要在培训阶段使用测试数据调用
tfv.fit(X_all)
,这是一种欺骗行为,可能会隐藏过度拟合。改为:
X\u train=tfv.fit\u transform(traindata)
学习单词到特征映射(词汇表),然后使用相同的向量器实例转换测试集:
X\u test=tfv.transform(testdata)
。要连接两个稀疏矩阵,请使用
scipy.sparse.vstack([A,B])
用于垂直堆叠或
scipy.sparse.hstack([A,B])
用于水平堆叠。此代码是一个不好的用法示例,请阅读官方文档和链接示例:@SimonKiely这是一个不好的做法。通过将矢量器装配到完整的集合,您可以从测试集合中学习。对于大型训练集和小型测试集,半监督学习可能不太适合,但它在方法上仍然存在缺陷,而且成本不必要。半监督学习是指当您使用额外的未标记数据时,而不是在测试集上训练时,即使您只在测试集上训练部分模型。测试集应该模拟看不见的数据,以测试泛化性能。