機器學習——特征工程


機器學習是從數據中自動分析獲取規律(模型),並利用規律對未知數據進行預測。

數據集的構成:特征值+目標值(根據目的收集特征數據,根據特征去判斷、預測)。(注意:機器學習不需要去除重復樣本數據)

常用的數據集網址:

  • Kaggle網址:https://www.kaggle.com/datasets
  • UCI數據集網址:https://archive.ics.uci.edu/ml/index.php
  • scikit-learn網址:https://scikit-learn.org/stable/datasets

機器學習首先需要對樣本數據進行處理,對樣本數據的處理過程叫做特征工程。

特征工程

特征工程:將原始數據轉換為更好地代表預測模型的潛在問題的特征的過程,從而提高了對未知數據的預測准確性。

特征工程的意義:提高結果的准確性。

一 特征抽取

特征抽取對文本等數據進行特征值化。(特征值化是為了計算機更好的去理解數據)

1.字典數據特征抽取

字典數據抽取:把字典中一些類別數據,分別進行轉換成特征。

作用:對字典數據進行特征值化

類:sklearn.feature_extraction.DictVectorizer
DictVectorizer語法:
DictVectorizer.fit_transform(X)
 X:字典或包含字典的迭代器
 返回值:返回sparse矩陣
DictVectorizer.inverse_transform(X)
 X:array數組或者sparse矩陣
 返回值:轉換之前的數據格式
DictVectorizer.get_feature_names()
 返回類別名稱
DictVectorizer.transform(X)
 按照原先的標准轉換

 

from sklearn.feature_extraction import DictVectorizer


def dictvec():
    """
    字典數據抽取
    :return:  None
    """
    # 實例化 # sparse矩陣
    dict = DictVectorizer(sparse=False)
    # 調用fit_transform
    data = dict.fit_transform(
        [{"city": '北京', 'temperature': 100}, {"city": '上海', 'temperature': 80}, {"city": '杭州', 'temperature': 60}])
    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
    print(data)
    return None


if __name__ == "__main__":
    dictvec()
eg

2.文本數據特征抽取

文本特征抽取用途文本分類、情感分析。中文文本抽取要分詞,分詞所用工具庫jieba。

作用:對文本數據進行特征化。

第一種方式:

類:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer()
  返回詞頻矩陣
CountVectorizer.fit_transform(X)
  X:文本或者包換文本的可迭代對象
  返回值:sparse矩陣
CountVectorizer.inverse_transform(X)
  X:array數組或者sparse矩陣
  返回值:轉換之前的數據格式
CountVectorizer.get_feature_names()
  返回值:單詞列表
 from sklearn.feature_extraction.text import CountVectorizer


def countvec():
    """
    對文本進行特征化
    :return:None
    """
    cv = CountVectorizer()
    data = cv.fit_transform(['life if short , i like python', 'life is too long, i dislike python'])
    print(cv.get_feature_names())  # 統計所有文章中所有得的詞,重復的只統計一次,單個字母不統計(詞列表)
    print(data.toarray())  # 統計文章中這個詞出現的次數
    return None
eg

第二種方式:TF-IDF

TF-IDF的主要思想是:如果某一個詞或者短語在一篇文章中出現的頻率高,並且在其它文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。

作用:用來評估一個字詞或者短語對於一個文件集或者一個語料庫中的其中一份文件的重要程度。

類:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer():

TfidfVectorizer.fit_transform(X)
   X: 文本或者包含文本字符串的可迭代對象
   返回值:sparse矩陣
TfidfVectorizer.inverse_transform(X)
   X:array數組或者sparse矩陣
   返回值:轉換之前的數據格式
TfidfVectorizer.get_feature_names()
   返回值:單詞列表

 

def cut_word():
    import jieba
    con1 = jieba.cut("今天很殘酷,不努力,明天更殘酷")
    con2 = jieba.cut("我們看到的光是從遙遠的宇宙來的,距離我們非常遠。我們看到的是它的過去")
    con3 = jieba.cut("了解事物的真正含義是在於了解它們之間的聯系以及本質")

    # 轉換成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    # 把列表轉換為字符串
    c1 = ' '.join(content1)
    c2 = " ".join(content2)
    c3 = " ".join(content3)
    return c1, c2, c3


def tfidfvec():
    """
    中文特征值化
    :return: None
    """
    c1, c2, c3 = cut_word()
    print(c1, c2, c3)
    from sklearn.feature_extraction.text import TfidfVectorizer
    tf = TfidfVectorizer()
    data = tf.fit_transform([c1, c2, c3])
    print(tf.get_feature_names())  # 統計所有文章中所有得的詞,重復的只統計一次,單個字母不統計(詞列表)
    print(data.toarray())  # 統計文章
    return None
eg

 

二 特征預處理

特征處理:通過特定的統計學方法(數學方法)將數據轉換成算法要求的數據。

數值型數據:(1)歸一化;(2)標准化。類別型數據:one-hot編碼。時間數據:時間切分。

1.歸一化

歸一化:通過對原始數據進行變換把數據映射到(默認為[0,1])之間。

公式參考:https://blog.csdn.net/haoji007/article/details/81157224

from sklearn.preprocessing import MinMaxScaler
def mm():
    """
    歸一化處理
    :return: None
    """
    mm = MinMaxScaler(feature_range=(2, 3))  # feature_range指定范圍
    data = mm.fit_transform([[90, 2, 10, 40], [60, 5, 18, 55]])
    print(data)
    pass

注意:在特定場景下最大值最小值是變化的,另外最大值和最小值非常容易受異常點影響,魯棒性較差,只適合傳統精確小數據場景。(使用較少)

2.標准化

標准化:通過對原始數據進行變換,把數據變換到均值為0,方差為1的范圍內。

 

 

 

def stand():
    """
    標准化
    :return: None
    """
    std = StandardScaler()
    data = std.fit_transform([[1, -1, 3], [2, 4, 4], [3, -2, 6]])
    print("平均值:,", std.mean_)
    print("方差: ", std.var_)
    print(data)

3.缺失值

def im():
    """
    缺失值
    :return:None
    """
    import numpy as np
    from sklearn.impute import SimpleImputer
    im = SimpleImputer(missing_values=np.nan, strategy='mean') #平均值補缺失值
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)

 

三 數據降維

數據降維指的是特征的數量。

1.特征選擇

進行特征選擇的原因:
1.冗余:部分特征相關度高,容易消耗計算性能。

2.噪聲:部分特征對預測結果有影響。

特征選擇:從提取到的所有特征中選擇部分特征作為訓練集的特征,選擇后的特征維數一般低於選擇前。

sklearn.feature_selection.VarianceThreshold
VarianceThreshold(threshold=0.0))
   刪除所有低方差特征
VarianceThreshold.fit_transform(X)
   X:numpy array格式的數據
   返回值:訓練集差異低於threshold的特征將被刪除,默認值是保留所有非零 
               方差特征,即刪除所有樣本中具有相同值的特征。
def var():
    """
    特征選擇-刪除低方差的特征
    :return:
    """
    from sklearn.feature_selection import VarianceThreshold
    var = VarianceThreshold(threshold=1.0) # threshold 設置方差閾值
    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)
    return None
eg

 

2.主成分分析

 PCA 是一種分析、簡化數據集的技術。

目的:將數據維數壓縮,盡可能降低原數據的維數(復雜度),損失少量信息。

作用:可以消減回歸分析或者聚類分析中特征的數量。

sklearn.decomposition.PCA
PCA(n_components=None)
   將數據分解為較低維數空間
PCA.fit_transform(X)
    X:numpy array格式的數據
    返回值:轉換后指定維數的array

注意:n_conponents:浮點數,指信息保持量 (0.9-1),數據維度壓縮時會損失信息。
def pca():
    """
    主成分分析進行特征降維
    :return:
    """
    from sklearn.decomposition import PCA
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)
eg

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM