官术网_书友最值得收藏!

1.2 數據預處理技術

在真實世界中,經常需要處理大量的原始數據,這些原始數據是機器學習算法無法理解的。為了讓機器學習算法理解原始數據,需要對數據進行預處理。

1.2.1 準備工作

來看看Python是如何對數據進行預處理的。首先,用你最喜歡的文本編輯器打開一個擴展名為.py的文件,例如preprocessor.py。然后在文件里加入下面兩行代碼:

        import numpy as np
        from sklearn import preprocessing

我們只是加入了兩個必要的程序包。接下來創建一些樣本數據。向文件中添加下面這行代碼:

        data=np.array([[3,   -1.5,     2,   -5.4], [0,     4,     -0.3,   2.1], [1,     3.3,
        -1.9, -4.3]])

現在就可以對數據進行預處理了。

1.2.2 詳細步驟

數據可以通過許多技術進行預處理,接下來將介紹一些最常用的預處理技術。

1.均值移除(Mean removal)

通常我們會把每個特征的平均值移除,以保證特征均值為0(即標準化處理)。這樣做可以消除特征彼此間的偏差(bias)。將下面幾行代碼加入之前打開的Python文件中:

        data_standardized=preprocessing.scale(data)
        print "\nMean=", data_standardized.mean(axis=0)
        print "Std deviation=", data_standardized.std(axis=0)

現在來運行代碼。打開命令行工具,然后輸入以下命令:

        $ python preprocessor.py

命令行工具中將顯示以下結果:

        Mean=[   5.55111512e-17   -1.11022302e-16   -7.40148683e-17   -7.40148683e-17]
        Std deviation=[ 1.   1.   1.   1.]

你會發現特征均值幾乎是0,而且標準差為1。

2.范圍縮放(Scaling)

數據點中每個特征的數值范圍可能變化很大,因此,有時將特征的數值范圍縮放到合理的大小是非常重要的。在Python文件中加入下面幾行代碼,然后運行程序:

        data_scaler=preprocessing.MinMaxScaler(feature_range=(0, 1))
        data_scaled=data_scaler.fit_transform(data)
        print "\nMin max scaled data=", data_scaled

范圍縮放之后,所有數據點的特征數值都位于指定的數值范圍內。輸出結果如下所示:

        Min max scaled data:
        [[ 1.               0.               1.               0.          ]
          [ 0.               1.               0.41025641     1.          ]
          [ 0.33333333     0.87272727     0.               0.14666667]]

3.歸一化(Normalization)

數據歸一化用于需要對特征向量的值進行調整時,以保證每個特征向量的值都縮放到相同的數值范圍。機器學習中最常用的歸一化形式就是將特征向量調整為L1范數,使特征向量的數值之和為1。增加下面兩行代碼到前面的Python文件中:

        data_normalized=preprocessing.normalize(data, norm='l1')
        print "\nL1 normalized data=", data_normalized

執行Python文件,就可以看到下面的結果:

        L1     normalized     data:
        [[     0.25210084     -0.12605042     0.16806723     -0.45378151]
          [     0.                0.625          -0.046875         0.328125   ]
          [     0.0952381        0.31428571    -0.18095238     -0.40952381]]

這個方法經常用于確保數據點沒有因為特征的基本性質而產生較大差異,即確保數據處于同一數量級,提高不同特征數據的可比性。

4.二值化(Binarization)

二值化用于將數值特征向量轉換為布爾類型向量。增加下面兩行代碼到前面的Python文件中:

        data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)
        print "\nBinarized data=", data_binarized

再次執行Python文件,就可以看到下面的結果:

        Binarized data:
        [[     1.     0.     1.     0.]
          [     0.     1.     0.     1.]
          [     0.     1.     0.     0.]]

如果事先已經對數據有了一定的了解,就會發現使用這個技術的好處了。

5.獨熱編碼

通常,需要處理的數值都是稀疏地、散亂地分布在空間中,然而,我們并不需要存儲這些大數值,這時就需要使用獨熱編碼(One-Hot Encoding)??梢园血殶峋幋a看作是一種收緊(tighten)特征向量的工具。它把特征向量的每個特征與特征的非重復總數相對應,通過one-of-k的形式對每個值進行編碼。特征向量的每個特征值都按照這種方式編碼,這樣可以更加有效地表示空間。例如,我們需要處理4維向量空間,當給一個特性向量的第n個特征進行編碼時,編碼器會遍歷每個特征向量的第n個特征,然后進行非重復計數。如果非重復計數的值是K,那么就把這個特征轉換為只有一個值是1其他值都是0的K維向量。增加下面幾行代碼到前面的Python文件中:

        encoder=preprocessing.OneHotEncoder()
        encoder.fit([[0, 2, 1, 12], [1, 3, 5, 3], [2, 3, 2, 12], [1, 2, 4, 3]])
        encoded_vector=encoder.transform([[2, 3, 5, 3]]).toarray()
        print "\nEncoded vector=", encoded_vector

結果如下所示:

        Encoded vector:
        [[ 0.   0.   1.   0.   1.   0.   0.   0.   1.   1.   0.]]

在上面的示例中,觀察一下每個特征向量的第三個特征,分別是1、5、2、4這4個不重復的值,也就是說獨熱編碼向量的長度是4。如果你需要對5進行編碼,那么向量就是[0, 1, 0, 0]。向量中只有一個值是1。第二個元素是1,對應的值是5。

主站蜘蛛池模板: 吴忠市| 博乐市| 沙田区| 南阳市| 江都市| 海城市| 东丽区| 安庆市| 罗源县| 新乡市| 武威市| 富阳市| 青田县| 乌恰县| 铜山县| 兰溪市| 都兰县| 阿拉善盟| 长白| 湘潭市| 南溪县| 焉耆| 深州市| 麻栗坡县| 安远县| 汽车| 怀集县| 盖州市| 区。| 伊宁县| 鲁山县| 罗城| 云阳县| 依兰县| 金阳县| 来安县| 河间市| 杂多县| 广饶县| 武邑县| 九江市|