機器學習系列之特徵工程

2021-08-22 04:52:50 字數 4833 閱讀 9384

'''

@description 特徵工程 - preprocess

1 框架:scikit-learn,依賴模組:scipy、pandas、numpy

2 pip3 install scikit-learn -i --trusted-host pypi.douban.com

3 模型 = 資料 + 演算法

4 機器學習開發流程:原始資料獲取(特徵值向量)->機器學習工程目標->資料加工處理->特徵工程->演算法選擇與實現

->模型評估

4 主流演算法是固定,可以通過超引數進行演算法調優,反而特徵工程關係最終模型的效能、準確性、穩定性

@author wolf

@time 2018-07-27

'''from sklearn.feature_extraction import dictvectorizer

from sklearn.feature_extraction.text import countvectorizer

from sklearn.feature_extraction.text import tfidfvectorizer

from sklearn.preprocessing import minmaxscaler, standardscaler, imputer

from sklearn.feature_selection import variancethreshold

from sklearn.decomposition import pca

import jieba

import numpy as np

# 1 詞典特徵

'''one-hot矩陣

應用場景:自然語言處理、情感分析

數值化特徵不處理,非數值化特徵數值化-one-hot

'''def dictvec():

dict = dictvectorizer(sparse=false)

data = dict.fit_transform(

[, ,

])print(dict.get_feature_names())

print(data)

# 2 純文字特徵

'''2.1 計算分詞詞頻

應用場景:自然語言處理、情感分析

'''def countvec():

cv = countvectorizer()

c1, c2, c3 = countword()

data = cv.fit_transform([c1, c2, c3])

print(cv.get_feature_names())

print(data.toarray())

'''2.2 tf-idf演算法:

應用場景:自然語言處理、情感分析

計算分詞的tfidf

原因:大部分語氣詞詞頻很高,但不能代表文件的屬性

tf:term frequency 改分詞在文件的詞頻

idf:inverse document frequency log(總文件數/該分詞出現的文件數)

tf-idf = tf * idf 表示該分詞在文件的重要性,與詞頻成正比,與該分詞出現的文件數成反比

fit_transform拆分分詞是按" "拆分,英文語法按" "斷詞而中文是按","短詞,所以借助jieba工具類

'''def tfidfvec():

tf = tfidfvectorizer()

c1, c2, c3 = countword()

print([c1, c2, c3])

data = tf.fit_transform([c1, c2, c3])

print(tf.get_feature_names())

print(data.toarray())

def countword():

'的什麼寫清楚和檔案檢查清楚')

con2 = jieba.cut('使用idea開發工具的同學注意避免紅色(有問題)、黃線(**重複)、灰色(未呼叫)**預警提示')

con3 = jieba.cut('使用eclipse開發工具的同學注意黃線(未呼叫、**重複)**預警提示')

content1 = list(con1)

content2 = list(con2)

content3 = list(con3)

c1 = ''.join(content1)

c2 = ''.join(content2)

c3 = ''.join(content3)

return c1, c2, c3

# 4 數值特徵

'''4.1 數值特徵歸一化處理

歸一化目的:使得某一特徵對最終結果不會造成更大的影響

總結:注意在特定場景下最大值與最小值是變化的。另外最大值與最小值非常容易受異常點影響,所以這種方法的魯棒性較差,只適合

傳統精確小資料場景

計算公式:x` = (x - min) / (max - min) x`` = x` * (mx - mi) + mi mx預設為1,mi預設為0

'''def mm():

mm = minmaxscaler(feature_range=(2, 3))

data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])

print(data)

return none

'''4.2 數值特徵標準化處理

特點:通過對原始資料進行變換把資料變換到均值為0,方差為1範圍內

公式:x' = (x - mean) / c c為標準差

var(方差) = ((x1 - mean)^ + (x2 - mean)^ + ...) / n, c = var開平方根

var(方差):考量資料的穩定性

'''def stand():

std = standardscaler()

data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])

print(data)

return none

'''4.3 數值特徵缺失值處理

pandas對缺失值的處理

a 指定值填充

df = pd.dataframe(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one','two', 'three'])

df = df.reindex(['a', 'b', 'c'])

print (df.fillna(df.var))

b 使用現有資料(向前、向後填充)

df = pd.dataframe(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two',

'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

#******************************==向前填充 pad/fill

print (df.fillna(method='pad'))

#******************************==向前填充 bfill/backfill

print (df.fillna(method='bfill'))

c 丟棄缺失值:pandas axis 0:行1:列

df = pd.dataframe(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'],columns=['one', 'two',

'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print (df.dropna(axis=0))

d 指定值替換

df = pd.dataframe()

print (df.replace())

'''# sklearn缺失值處理

def im():

# nan, nan

# axis 0:列 1:行

im = imputer(missing_values="nan", strategy='mean', axis=0)

data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])

print(data)

return none

# 5 資料特徵降維

# 5.1 過濾方法

def var():

var = variancethreshold(threshold=0.0)

data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])

print(data)

return none

# 5.2 主成分分析

'''n_components小數:原資料特徵保持資料原始性到百分比

n_components小數:原資料特徵降維到幾個特徵

數學原理:

'''def pca():

pca = pca(n_components=0.9)

data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])

print(data)

return none

if __name__ == "__main__":

tfidfvec()

機器學習之特徵工程

在工業界一直流行著一句話,資料的質量決定了模型的上線了,而特徵工程與模型的選擇只是盡可能的去逼近這個上線,當我們在資料無法改變的情況,特徵工程的優化便顯得尤為重要。我們輸入模型中,模型只認識資料,並不知道某一列所代表的含義,例如樹模型,它只會按照一定的規則去不停的分支,並不知道分支所代表的含義,而特...

機器學習之特徵工程

特徵工程是將原始資料轉化為更好代表 模型的潛在問題的特徵的過程,從而提高了對位置資料的 準確性。其包括特徵構建 特徵提取 特徵選擇三部分。資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已,成功的結果往往源自最開始對資料的處理。tf term frequency,詞的頻率,即出現的次...

機器學習之特徵工程

一 特徵抽象 特徵抽象是指將資料來源抽象演算法可以理解的資料,我們期望的資料是一組可以表達資料某種特性的數字。下面對幾種資料型別抽象舉例 1 時間戳 以某一天為基準值,採用演算法算出某數值,其他的採用和該基準值的差距。2 二值類問題 文字或其他描述的二值問題,可以量化為0和1表示。3 多值有序問題 ...