【问题标题】:Why is python's hstack used here for machine learning为什么这里用python的hstack进行机器学习
【发布时间】:2013-04-25 00:39:05
【问题描述】:

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

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

问题:做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

【问题讨论】:

  • 你不知道type函数吗?如果您想知道“foo 是什么类型的对象”,而不是执行 print foo 并尝试猜测,执行 print type(foo) 您会得到答案。然后你就可以上网查了。或者,您通常可以跳过所有这些,直接在交互式解释器中执行help(foo)
  • 我是 python 新手,感谢您的提示! <class 'scipy.sparse.csr.csr_matrix'>
  • 好吧,csr_matrix 只是一个“压缩稀疏行矩阵”。当你有一个很多行都是空的巨大矩阵时,它很方便,但基本上,你可以把它想象成一个普通的旧矩阵。
  • @abarnert:实际上,只要矩阵包含很多零,它就会节省空间,而不仅仅是当有空行时。与更直接的坐标稀疏矩阵格式相比,“压缩行”名称是指行索引的压缩表示。

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


【解决方案1】:

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(或matrix)的结构,您可以随时查看其shapedtype 及其成员之一(des[0],如果它是一维的,@987654337 @如果是 2D 等)。如果我是对的,shape 将类似于(12345,)dtypeobjectdes[0]((0, 2991), 0.0923069427531)

您还可以打印出arrayrepr,而不是其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”和“j”在西班牙语中的发音与英语完全相同,只是发音不同。)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-09
      • 2014-03-05
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2011-06-04
      • 2017-03-03
      • 2019-05-14
      相关资源
      最近更新 更多