我正在尝试理解一些python代码,试图根据广告发布预测价格。
在拟合文本矢量器之前,函数对广告描述des
和广告标题titles
进行hstack((des, titles))
的拟合。
问题:做hstack
的原因是什么?当打印出来时,我没有看到des
和merged
之间的任何差异。merged
似乎被用作训练数据,而不是分别在des
和titles
中传递。这是如何工作的呢?
Vectorizing函数/strong>
def fit(des, titles, sal, clf, alpha):
tRidge = time()
vect = TfidfVectorizer(min_df=1,ngram_range=(1,3),max_features=24000000)
vect2 = TfidfVectorizer(min_df=1,ngram_range=(1,3),max_features=24000000)
des = vect.fit_transform(des)
titles = vect2.fit_transform(titles)
merged = hstack((des, titles))
print des, "nnnn"
print titles, "nnnn"
print merged
rr = linear_model.Ridge(alpha= alpha)
rr.fit(merged,sals)
return vect, vect2, rr
结果
(0, 2991) 0.0923069427531
(0, 2989) 0.156938669001
(0, 2988) 0.183108029528
(0, 2984) 0.183108029528
(0, 2983) 0.0923069427531
(0, 2982) 0.0923069427531
(0, 2981) 0.0923069427531
(0, 2976) 0.0923069427531
(0, 2974) 0.0784693345005
(0, 2973) 0.1373027904
(0, 2968) 0.0923069427531
(0, 2967) 0.0923069427531
(0, 2966) 0.183108029528
(0, 2859) 0.0610360098426
(0, 2858) 0.0610360098426
(0, 2855) 0.0548137869472
(0, 2811) 0.0923069427531
(0, 2810) 0.0610360098426
(0, 2807) 0.0548137869472
(0, 2671) 0.0923069427531
(0, 2670) 0.0923069427531
(0, 2663) 0.0784693345005
(0, 2662) 0.0784693345005
(0, 2659) 0.0819523573892
(0, 2642) 0.0923069427531
: :
(9, 225) 0.0518713890037
(9, 208) 0.105028746631
(9, 155) 0.0518713890037
(9, 154) 0.0518713890037
(9, 153) 0.0518713890037
(9, 152) 0.0518713890037
(9, 151) 0.0518713890037
(9, 149) 0.0440954196221
(9, 140) 0.0835380774247
(9, 135) 0.0518713890037
(9, 134) 0.0518713890037
(9, 132) 0.0881908392442
(9, 131) 0.0771565630894
(9, 122) 0.0518713890037
(9, 121) 0.0518713890037
(9, 118) 0.0518713890037
(9, 117) 0.0518713890037
(9, 116) 0.0771565630894
(9, 25) 0.0518713890037
(9, 8) 0.0518713890037
(9, 7) 0.0440954196221
(9, 6) 0.0440954196221
(9, 5) 0.0518713890037
(9, 4) 0.0518713890037
(9, 3) 0.0518713890037
(0, 69) 0.42208707303
(0, 68) 0.42208707303
(0, 27) 0.42208707303
(0, 26) 0.42208707303
(0, 24) 0.379058050386
(0, 0) 0.379058050386
(1, 62) 0.42435658025
(1, 61) 0.42435658025
(1, 60) 0.42435658025
(1, 28) 0.42435658025
(1, 23) 0.42435658025
(1, 22) 0.315606501824
(2, 59) 0.346009923908
(2, 58) 0.346009923908
(2, 44) 0.346009923908
(2, 43) 0.346009923908
(2, 42) 0.346009923908
(2, 7) 0.346009923908
(2, 6) 0.346009923908
(2, 5) 0.346009923908
(2, 0) 0.205467906151
(3, 70) 0.343926205461
(3, 69) 0.227413915309
(3, 68) 0.227413915309
(3, 41) 0.343926205461
: :
(7, 16) 0.231189334057
(7, 12) 0.271958221129
(7, 11) 0.271958221129
(7, 10) 0.271958221129
(8, 76) 0.265672282889
(8, 75) 0.265672282889
(8, 74) 0.265672282889
(8, 73) 0.265672282889
(8, 72) 0.265672282889
(8, 53) 0.265672282889
(8, 52) 0.22584571227
(8, 51) 0.22584571227
(8, 35) 0.265672282889
(8, 18) 0.265672282889
(8, 17) 0.265672282889
(8, 16) 0.22584571227
(8, 15) 0.265672282889
(8, 14) 0.265672282889
(8, 13) 0.265672282889
(9, 65) 0.435367791014
(9, 64) 0.435367791014
(9, 63) 0.370102397554
(9, 22) 0.323795863959
(9, 9) 0.435367791014
(9, 8) 0.435367791014
(0, 2991) 0.0923069427531
(0, 2989) 0.156938669001
(0, 2988) 0.183108029528
(0, 2984) 0.183108029528
(0, 2983) 0.0923069427531
(0, 2982) 0.0923069427531
(0, 2981) 0.0923069427531
(0, 2976) 0.0923069427531
(0, 2974) 0.0784693345005
(0, 2973) 0.1373027904
(0, 2968) 0.0923069427531
(0, 2967) 0.0923069427531
(0, 2966) 0.183108029528
(0, 2859) 0.0610360098426
(0, 2858) 0.0610360098426
(0, 2855) 0.0548137869472
(0, 2811) 0.0923069427531
(0, 2810) 0.0610360098426
(0, 2807) 0.0548137869472
(0, 2671) 0.0923069427531
(0, 2670) 0.0923069427531
(0, 2663) 0.0784693345005
(0, 2662) 0.0784693345005
(0, 2659) 0.0819523573892
(0, 2642) 0.0923069427531
: :
(7, 3669) 0.231189334057
(7, 3665) 0.271958221129
(7, 3664) 0.271958221129
(7, 3663) 0.271958221129
(8, 3729) 0.265672282889
(8, 3728) 0.265672282889
(8, 3727) 0.265672282889
(8, 3726) 0.265672282889
(8, 3725) 0.265672282889
(8, 3706) 0.265672282889
(8, 3705) 0.22584571227
(8, 3704) 0.22584571227
(8, 3688) 0.265672282889
(8, 3671) 0.265672282889
(8, 3670) 0.265672282889
(8, 3669) 0.22584571227
(8, 3668) 0.265672282889
(8, 3667) 0.265672282889
(8, 3666) 0.265672282889
(9, 3718) 0.435367791014
(9, 3717) 0.435367791014
(9, 3716) 0.370102397554
(9, 3675) 0.323795863959
(9, 3662) 0.435367791014
(9, 3661) 0.435367791014
hstack
只是获取数组序列并将它们水平堆叠,顾名思义。例如:
>>> a = np.array([[1,2], [3,4]])
>>> b = np.array([[5], [6]])
>>> np.hstack(a, b)
array([[1, 2, 5],
[3, 4, 6]])
在序列都是1D数组的特殊情况下,这只是将它们连接成一个更长的1D数组:
>>> a = np.array([1,2,3])
>>> b = np.array([4,5])
>>> np.hstack(a, b)
array([1, 2, 3, 4, 5])
所以,如果des
和titles
只是1D数组,那么merged
也是,并且你看到的输出看起来很合理。
所以,他们是吗?下面是它们的构造:
vect = TfidfVectorizer(min_df=1,ngram_range=(1,3),max_features=24000000)
des = vect.fit_transform(des)
TfidfVectorizer
返回TF-IDF特征的(稀疏)矩阵。我不确定fit_transform
是什么,但从名字上看,它听起来像是一个拟合函数,它会取一个矩阵并返回一个系数向量。
那么,为什么它们在打印出来的时候看起来像2D数组呢?我猜它们是对象的一维数组,每个对象本身都有一些结构。毕竟,一个2列矩阵,其中第0列是一个2元组,第1列是一个浮点数,这并不比一个平坦向量(每个元素都是一个2元组和一个浮点数的2元组)给你带来多少好处。
为了更好地了解array
(或matrix
)的结构,您可以查看它的shape
, dtype
和它的一个成员(如果是1D,则是des[0]
,如果是2D,则是des[0,0]
,等等)。如果我是对的,shape
将类似于(12345,)
, dtype
object
和des[0]
((0, 2991), 0.0923069427531)
。
您也可以打印出array
的repr
而不是str
。(repr
是你在交互式提示符下计算对象时得到的;str
是当你print
时得到的。如果您想要print
repr
,您必须显式地执行:print repr(des)
。)这将向您显示括号和逗号,而不是一个漂亮的表格格式,并且您应该能够一眼看出形状。
因此,如果des
的shape
为(12345,)
, titles
的shape
为(67890,)
,那么hstack((des, titles))
的形状为(80235,)
,然后将其打印出来并进行粗略扫描,您将很难看到它与des
之间的区别。
最后,这与单独使用des
和titles
进行训练有什么不同?根据训练模型的不同,它可能只是做同样事情的一种更简洁的方式。但是有些训练器可能会使用同一集中的两个数据点之间的引用,在这种情况下,结果会有所不同。(直观地看,就像一个说英语的人试图训练自己发音西班牙语。如果你只是一些例子,字母"g"有时听起来像一个艰难的"g",有时像一个"h",很难学习条,如果与此同时,你也得例子,字母"j"总是明显的"h",那么你可能 会的规则,因为"g"one_answers"j"有相同的声音在西班牙英语一样,在相同的情况下,它只是一个不同的声音。)
scipy.sparse.hstack
连接TfidfVectorizer.fit_transform
返回的稀疏tf-idf矩阵。在Python提示符中尝试以下操作:
>>> from scipy.sparse import csr_matrix, hstack
>>> x = csr_matrix([[1, 2, 3], [4, 5, 6]])
>>> x
<2x3 sparse matrix of type '<type 'numpy.int32'>'
with 6 stored elements in Compressed Sparse Row format>
>>> x.toarray()
array([[1, 2, 3],
[4, 5, 6]])
>>> hstack([x, x])
<2x6 sparse matrix of type '<type 'numpy.int32'>'
with 12 stored elements in Compressed Sparse Row format>
>>> hstack([x, x]).toarray()
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
由于根据scikit-learn约定,行表示(训练或测试)样本,列表示特征,因此此代码将从全文中学习到的n-gram特征的tf-idf权重与从标题中学习到的相似特征(尽管权重不同)相结合。它只是通过附加矩阵来计算组合,这是完全有效的,因为脊回归将学习每个特征(每列)系数权重。
不幸的是,打印稀疏矩阵并不能产生非常有用的结果(尽管它可以用于调试或稍后重建相同的矩阵)。