Python之特徵工程-3

  一、什麼是特徵工程?其實也是數據處理的一種方式,和前面的原始數據不一樣的是,我們在原始數據的基礎上面,通過提取有效特徵,來預測目標值。而想要更好的去得出結果,包括前面使用的數據處理中數據特徵提取,新增減少等手段都是特徵功能的一種,這裏爲什麼要單獨提出來講特徵工程,而不是數據處理呢?

  二、數據處理的方式有很多種方式,合併等。這裏講特徵工程主要是講轉換器,爲啥這樣說呢,因爲我們在使用數據的時候,比如:文本,那我們通過文本的方式去計算,這個方式不利於數學公式的發揮。那麼問題來了,想要更好的使數據達到預測的效果,那數據的轉換是很有必要的。

    簡單理解就是:將原本比如文本型的數據,進行中文分詞過後,在將文本變換成數字,具體爲一個二維的矩陣數據。

  三、fit、transform、fit_transform

  1)在轉換其中存在三個函數分別爲fit、transform、fit_transform,翻譯爲:學習,轉換,學習和轉換

  2)fit中存在兩個參數:X,y:即特徵值,目標值。只傳X,即爲無監督學習。X,y都傳,即監督學習(有意識的去靠近目標)

  3)transform,按照學習後的方式,進行其他數據的學習。有點像吧學習好的方式,套用到其他數據集得出結果。

  4)fit_transform,兩種方式的結合。

  四、轉換器

  1)字典(JSON)轉換器

from sklearn.feature_extraction import DictVectorizer

# 字典特徵提取
def dict_data():
    # sparse=False:one-hot, True:矩陣
    dict = DictVectorizer(sparse=True)
    data = dict.fit_transform([{"city": "四川", "temperature": 20}, {"city": "北京", "temperature": 30}])
    # 轉換成矩陣
    print(data.toarray())
    # 特徵名稱
    print(dict.get_feature_names())
    # 逆向轉換成字典
    print(dict.inverse_transform(X=data))

  結果:

  說明:可以看出,特徵名稱,是將不是數據的類型分開,通過0表示沒有,1表示存在的方式形成矩陣數據

  2)文本特徵提取轉換器

import jieba
from sklearn.feature_extraction.text import CountVectorizer

# 文本特徵提取
def count_data():
    cv = CountVectorizer()
    # data = cv.fit_transform(["I love you", "I like you"])
    # data = cv.fit_transform(["人生 苦短 我 喜歡 Python", "人生 漫長 我 討厭 Python"])
    # 中文文字分詞
    data = cv.fit_transform([' '.join(jieba.cut("人生苦短,我喜歡Python")), ' '.join(jieba.cut("人生漫長,我討厭Python"))])
    print(data.toarray())
    print(cv.get_feature_names())if __name__ == '__main__':
    count_data()

  結果:

  說明:文本特徵提取的方式一般是通過中文分詞的方式來處理的,因爲英文默認是分開的所以好處理,但是中文需要分詞器來處理。結果也是用0,1表示數據在樣本中的數量。

  3)tf_idf(term frequency and inverse document frequency)詞的頻率和逆文檔頻率。(逆文檔頻率公式:log(總文檔數量/改詞頻率))

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer

# term frequency(詞出現的頻率) and inverse document frequency(log(總文檔數量/改詞頻率))
def tf_idf_data():
    cv = TfidfVectorizer()
    # data = cv.fit_transform(["I love you", "I like you"])
    # data = cv.fit_transform(["人生 苦短 我 喜歡 Python", "人生 漫長 我 討厭 Python"])
    data = cv.fit_transform([' '.join(jieba.cut("人生苦短,我喜歡Python")), ' '.join(jieba.cut("人生漫長,我討厭Python"))])
    print(data.toarray())
    # 特徵名稱
    print(cv.get_feature_names())

  結果:

  說明:單文字不做計算,他是通過文章中出現的詞的頻率越少,確認他的權重越高。tf-idf具體計算過程可以參考:https://baike.baidu.com/item/tf-idf/8816134?fr=aladdin

  4)歸一化

  a、公式:

            x - min
        x' = —————————
             max - min

        x" = x'(mx - mi) + mi
        (default mx = 1, mi = 0)
        mi, mx爲區間,min, max爲一中特徵總的最小最大值。x爲實際值,x"爲最終結果

  b、代碼實現

from sklearn.preprocessing import MinMaxScaler

# 歸一化
def normalize_data():
    """
    數據:
        30 10 20
        70 30 50
        110 50 35
    公式:
              x - min
        x' = —————————
             max - min

        x" = x'(mx - mi) + mi
        (default mx = 1, mi = 0)
        mi, mx爲區間,min, max爲一中特徵總的最小最大值。x爲實際值,x"爲最終結果
    """
    # feature_range指數據區間默認(0, 1)
    mms = MinMaxScaler(feature_range=(2, 3))
    data = mms.fit_transform([[30, 10, 20], [70, 30, 50], [110, 50, 35]])
    print(data)

   c、結果:

  d、說明:歸一化的目的是將數據,按照比例的方式縮小,以減少,由於某個特徵值,特別大引起權重的變化。

  e、缺點:容易受到單個特徵值的影響,在公式中x'爲計算結果,如果max是異常點很大,那麼其他數據結果,值就會特別小。會讓數據的權重值下降。所以一般不採用這種方式。

  5)標準化

  a、公式

     方差:
              (x1 - avg)^2 + (x2 - avg)^2 + ...
        var = —————————————————————————————————
                            n
        標準差:
             ___
        a = √var
             x - avg
        x' = ————————
                a
        avg爲平均值,x'爲最終結果

  b、代碼實現

from sklearn.preprocessing import StandardScaler

# 標準化
def standard_data():
    """
    公式:
        方差:
              (x1 - avg)^2 + (x2 - avg)^2 + ...
        var = —————————————————————————————————
                            n
        標準差:
             ___
        a = √var
             x - avg
        x' = ————————
                a
        avg爲平均值,x'爲最終結果
    """
    ss = StandardScaler()
    data = ss.fit_transform([[30, 10, 20], [70, 30, 50], [110, 50, 35]])
    print(data)

  c、結果

  d、說明:數據標準化會受到單個異常點的影響,但是影響不大。這種方式得出的結果,針對於數據來說比較平均,是比較常見的一種方式。標準化的目的也是爲了減少實際數據中特徵值的影響。當特徵都區域統一權重狀態。

  6)降維(PCA,又稱主成分分析)

  a、方式:通過計算獲取特徵值結果,如果一個特徵中的數據差異很小,就可以降維(即刪除此特徵)。保留有用的特徵數據。

  b、代碼實現

import pandas
from sklearn.decomposition import PCA

# 降維
def dimensionality_reduction():
    # 讀取數據
    orders = pandas.read_csv("market/orders.csv")
    prior = pandas.read_csv("market/order_products__prior.csv")
    products = pandas.read_csv("market/products.csv")
    aisles = pandas.read_csv("market/aisles.csv")
    # 合併數據
    _msg = pandas.merge(orders, prior, on=["order_id", "order_id"])
    _msg = pandas.merge(_msg, products, on=["product_id", "product_id"])
    merge_data = pandas.merge(_msg, aisles, on=["aisle_id", "aisle_id"])
    # 交叉表(特殊分組)
    # (用戶ID, 類別)
    cross = pandas.crosstab(merge_data["user_id"], merge_data["aisle"])
    print(cross.shape)
    # 降維
    pca = PCA(n_components=0.9)
    data = pca.fit_transform(cross)
# 查看數據量和結果
print(data.shape)

  說明:n_components爲數據保留率一般(90%~95%)

  c、結果:

  d、解釋:這裏的134爲原始數據的特徵數量,27爲降維過後的特徵數量,從計算上面來看,已經達到效果了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章