-2

我正在尝试了解一些尝试根据广告发布来预测价格的 python 代码。

在拟合文本矢量化器之前,hstack((des, titles))对广告描述des和广告标题执行了一个函数titles

问题:这样做的原因是什么hstack?我看不出desmerged打印出来有什么区别。merged似乎被用作训练数据,而不是des单独titles传入。这是如何运作的?

矢量化功能

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, "\n\n\n\n"
    print titles, "\n\n\n\n"
    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
4

2 回答 2

2

hstack顾名思义,只需要一个数组序列并将它们水平堆叠起来​​。例如:

>>> a = np.array([[1,2], [3,4]])
>>> b = np.array([[5], [6]])
>>> np.hstack(a, b)
array([[1, 2, 5],
       [3, 4, 6]])

在序列都是一维数组的特殊情况下,这只是将它们连接成一个更长的一维数组:

>>> a = np.array([1,2,3])
>>> b = np.array([4,5])
>>> np.hstack(a, b)
array([1, 2, 3, 4, 5])

因此,如果destitles只是一维数组,那么 也是merged,并且您看到的输出看起来非常合理。

那么,是吗?好吧,这是它们的构造方式:

vect = TfidfVectorizer(min_df=1,ngram_range=(1,3),max_features=24000000)
des = vect.fit_transform(des)

TfidfVectorizer返回 TF-IDF 特征的(稀疏)矩阵。我不确定是什么fit_transform,但从名字来看,它确实听起来像是一个拟合函数,它需要一个矩阵并返回一个系数向量。

那么,为什么打印出来它们看起来像二维数组呢?我的猜测是它们是一维对象数组,每个对象本身都有一些结构。毕竟,第 0 列是 2 元组,第 1 列是浮点数的 2 列矩阵不会比每个元素都是 2 元组和浮点数的 2 元组的平面向量买多少.

要更好地查看array(or matrix) 的结构,您始终可以查看它的shape、其dtype和它的一个成员(des[0]如果它是一维的,des[0,0]如果是二维的,等等)。如果我是对的,shape则将类似于(12345,)dtype objectdes[0] ((0, 2991), 0.0923069427531)

您也可以打印出reprof thearray而不是 its str。(这repr是您在交互式提示下评估对象时得到的结果;这str是您得到的print结果。如果您想要 ,printrepr必须明确执行:print repr(des)。)这将向您显示括号和逗号,而不是一个漂亮的表格格式,你应该一眼就能看出形状。

所以,如果des有一个shapeof,比如说,,(12345,)并且titles有一个shape,比如说,,(67890,)那么hstack((des, titles))就会有一个形状,比如说,,(80235,)然后打印出来并粗略地扫描一下,你会很难看到它和 之间的区别des

最后,这与单独训练desthentitles有何不同?好吧,根据训练模型的不同,它可能只是做同样事情的更简洁的方式。但是有可能一些培训师使用同一组中两个数据点之间的引用,在这种情况下,结果会有所不同。(直观地看一下,作为一个说英语的人试图训练自己发音西班牙语。如果你只是得到一堆例子,字母“g”有时听起来像一个硬“g”,有时像一个“h” ,很难学习这个规则——但如果同时,你也得到了字母“j”总是发音为“h”的例子,那么你可能得到规则,因为“g”和“j”在西班牙语中的发音与英语完全相同,只是发音不同。)

于 2013-05-01T02:15:29.270 回答
1

scipy.sparse.hstack连接由 . 返回的稀疏 tf-idf 矩阵TfidfVectorizer.fit_transform。在 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 权重与标题中的相似特征(尽管权重不同)相结合。它通过仅附加矩阵来计算组合,这是完全有效的,因为岭回归将学习每个特征(每列)的系数权重。

不幸的是,打印稀疏矩阵不会产生非常丰富的结果(尽管它可以用于调试或稍后重建相同的矩阵。

于 2013-05-01T14:58:03.283 回答