为什么python的hstack在这里用于机器学习

时间:2013-05-01 00:18:07

标签: python numpy machine-learning nlp scikit-learn

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

在拟合文字矢量图之前,函数会对广告说明hstack((des, titles))和广告标题des titles {/ p>}。{/ p>

问题:执行hstack的原因是什么?打印出来时,desmerged之间没有任何区别。 merged似乎用作培训数据,而不是单独传递destitles。这是如何工作的?

向量化功能

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

2 个答案:

答案 0 :(得分: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]])

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

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

因此,如果destitles只是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及其中一个成员({ {1}}如果是1D,des[0]如果是2D,等等。如果我是对的,des[0,0]将类似于shape(12345,) dtypeobject des[0]

您还可以打印((0, 2991), 0.0923069427531) repr而不是array。 (str是您在交互式提示下评估对象时获得的内容; repr是您str时获得的内容。如果您想要print print,您必须明确地执行此操作:repr。)这将显示括号和逗号,而不是一个很好的表格格式,您应该能够一目了然地告诉形状。

所以,如果print repr(des)的{​​{1}}为des,而shape的{​​{1}}有(12345,),例如titles ,然后shape将具有(67890,)的形状,并且只是将其打印出来并进行粗略扫描,您将很难看到它与{{1}之间的区别}}

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

答案 1 :(得分:1)

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权重与具有相似特征(尽管加权不同)相结合标题。它只是通过附加矩阵来计算组合,这是完全有效的,因为岭回归将学习每个特征(每列)系数权重。

不幸的是,打印稀疏矩阵并不会产生非常丰富的信息(虽然它可以用于调试或以后重建相同的矩阵。