Python TF-IDF如何为机器学习生成功能?一袋文字有什么不同?
我希望得到TF-IDF如何产生可用于机器学习的功能的简要解释。单词袋和TF-IDF有什么区别?我了解TF-IDF的工作原理;但不包括特征是如何用它生成的,以及这些特征是如何用于分类/回归的 我正在使用scikit学习;以下代码在理论上和实践中实际做了什么?我已经用我的理解和一些问题对其进行了评论,非常感谢您的帮助: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
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这是一个不好的做法。通过将矢量器装配到完整的集合,您可以从测试集合中学习。对于大型训练集和小型测试集,半监督学习可能不太适合,但它在方法上仍然存在缺陷,而且成本不必要。半监督学习是指当您使用额外的未标记数据时,而不是在测试集上训练时,即使您只在测试集上训练部分模型。测试集应该模拟看不见的数据,以测试泛化性能。