python人工智能——机器学习——特征工程
數(shù)據(jù)的特征工程
1.特征工程是什么
特征工程是將原始數(shù)據(jù)轉(zhuǎn)換為更好地代表預(yù)測(cè)模型的潛在問(wèn)題的特征的過(guò)程,從而提高了對(duì)位置數(shù)據(jù)的預(yù)測(cè)準(zhǔn)確性。
2.特征工程的意義
直接影響預(yù)測(cè)結(jié)果
3.scikit-learn庫(kù)介紹
python語(yǔ)言的機(jī)器學(xué)習(xí)工具
scikit-learn包括許多知名的機(jī)器學(xué)習(xí)算法的實(shí)現(xiàn)
scikit-learn文檔完善,容易上手,豐富的API
4.數(shù)據(jù)的特征抽取
(1)特征抽取實(shí)例演示
#導(dǎo)入包 from sklearn.feature_extraction.text import CountVectorizer#實(shí)例化CountVectorizer vector=CountVectorizer()#調(diào)用fit_transform輸入并轉(zhuǎn)換數(shù)據(jù) res=vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])#打印結(jié)果 print(vector.get_feature_names()) print(res.toarray())
通過(guò)演示得出結(jié)論:
(2)sklearn特征抽取API
sklearn.feature_extraction(3)字典特征抽取
作用:對(duì)字典數(shù)據(jù)進(jìn)行特征值化
sklearn.feature_extraction.DictVectorizerDictVectorizer語(yǔ)法
DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X)X:字典或者包含字典的迭代器返回值:返回sparse矩陣 DictVectorizer.inver_transform(X)X:array數(shù)據(jù)或者sparse矩陣返回值:轉(zhuǎn)換之前數(shù)據(jù)格式 DictVectorizer.get_feature_names()返回類(lèi)別名稱(chēng) DictVectorizer.transform(X)按照原先的標(biāo)準(zhǔn)轉(zhuǎn)換流程
1.實(shí)例化DictVectorizer2.調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換,注意返回格式演示
from sklearn.feature_extraction import DictVectorizerdef dictvec():'''字典數(shù)據(jù)抽取:return: none'''#實(shí)例化dict=DictVectorizer()#調(diào)用fit_transformdata=dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}])print(data)return Noneif __name__=='__main__':dictvec()
返回值:sparse矩陣格式
原因:節(jié)約內(nèi)存,方便讀取處理
其實(shí)也可以轉(zhuǎn)換為普通二維矩陣:
dict=DictVectorizer(sparse=False)
兩次輸出沒(méi)有什么差別,只不過(guò)sparse矩陣沒(méi)有打印0值。
打印類(lèi)別:
print(dict.get_feature_names())
字典數(shù)據(jù)抽取:把字典中一些類(lèi)別數(shù)據(jù),分別進(jìn)行轉(zhuǎn)換成特征。
數(shù)組形式,有類(lèi)別特征,先要轉(zhuǎn)換字典數(shù)據(jù)。
(4)文本特征抽取
作用:對(duì)文本數(shù)據(jù)進(jìn)行特征值化
CountVectorizer語(yǔ)法
CountVectorizer()返回詞頻矩陣CountVectorizer.fit_transform(X)X:文本或者包含文本字符串的可迭代對(duì)象返回值:返回sparse矩陣CountVectorizer.inverse_transform(X)X:array數(shù)組或者sparse矩陣返回值:轉(zhuǎn)換之前數(shù)據(jù)格式CountVectorizer.get_feature_name()返回值:單詞列表流程
1.實(shí)例化CountVectorizer2.調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換,注意返回格式,利用toarray()進(jìn)行矩陣轉(zhuǎn)換array數(shù)組演示
def countvec():'''對(duì)文本進(jìn)行特征值化:return: none'''cv=CountVectorizer()data=cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])print(data)return None
這仍然是sparse矩陣,要轉(zhuǎn)換成普通二維矩陣:
打印類(lèi)別:
1.詞的列表:統(tǒng)計(jì)所有文章當(dāng)中的詞,重復(fù)的只看做一次。
2.對(duì)每篇文章,在詞的列表里面統(tǒng)計(jì)每個(gè)詞出現(xiàn)的次數(shù)。(單個(gè)字母不統(tǒng)計(jì))
對(duì)于中文情況:
data=cv.fit_transform(["人生苦短,我用python","人生漫長(zhǎng),不用python"])
顯然,中文情況不能很好的抽取特征。
注意,切分的依據(jù)不是逗號(hào)“,”
data=cv.fit_transform(["人生 苦短,我用 python","人生 漫長(zhǎng),不用 python"])
所以,需要對(duì)中文進(jìn)行分詞才能詳細(xì)的進(jìn)行特征值化。
分詞需要的包:
import jieba然后進(jìn)行分詞:
def cutword():con1=jieba.cut("這是一個(gè)久遠(yuǎn)的故事。當(dāng)你笑著 醒了的時(shí)候 別提會(huì)有多快樂(lè)!早晨的微笑 是有魔力的,帶來(lái)一天的好心情。")con2=jieba.cut("六一的任性魔術(shù)是將手中的“魔法棒”敲醒遇到的第一個(gè)熟悉的可愛(ài)的人。誰(shuí)會(huì)繼續(xù) 小小傲嬌可是要飛上天太陽(yáng)高高的照。")con3=jieba.cut("敲醒了那個(gè)人竟不知太陽(yáng)在哪,傻笑著,如初美好。傲嬌貓")#轉(zhuǎn)換成列表content1=list(con1)content2=list(con2)content3=list(con3)#把列表轉(zhuǎn)換成字符串c1=" ".join(content1)c2=" ".join(content2)c3=" ".join(content3)return c1,c2,c3 def countvec():'''對(duì)文本進(jìn)行特征值化:return: none'''c1,c2,c3=cutword()print(c1,c2,c3)cv=CountVectorizer()data=cv.fit_transform([c1,c2,c3])print(cv.get_feature_names())print(data.toarray())return None結(jié)果如下:
Building prefix dict from the default dictionary ... Dumping model to file cache C:\Users\dai'er\AppData\Local\Temp\jieba.cache Loading model cost 0.968 seconds. Prefix dict has been built succesfully. 這是 一個(gè) 久遠(yuǎn) 的 故事 。 當(dāng) 你 笑 著 醒 了 的 時(shí)候 別提 會(huì) 有 多 快樂(lè) ! 早晨 的 微笑 是 有 魔力 的 , 帶來(lái) 一天 的 好 心情 。 六一 的 任性 魔術(shù) 是 將 手中 的 “ 魔法 棒 ” 敲醒 遇到 的 第一個(gè) 熟悉 的 可愛(ài) 的 人 。 誰(shuí) 會(huì) 繼續(xù) 小小 傲嬌 可是 要 飛 上天 太陽(yáng) 高高的 照 。 敲醒 了 那個(gè) 人竟 不知 太陽(yáng) 在 哪 , 傻笑 著 , 如初 美好 。 傲嬌 貓 ['一個(gè)', '一天', '上天', '不知', '久遠(yuǎn)', '人竟', '任性', '傲嬌', '傻笑', '六一', '別提', '可是', '可愛(ài)', '太陽(yáng)', '如初', '小小', '帶來(lái)', '微笑', '心情', '快樂(lè)', '手中', '故事', '敲醒', '早晨', '時(shí)候', '熟悉', '第一個(gè)', '繼續(xù)', '美好', '這是', '遇到', '那個(gè)', '高高的', '魔力', '魔術(shù)', '魔法'] [[1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0][0 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 1][0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0]]但實(shí)際上,統(tǒng)計(jì)單詞次數(shù)的分類(lèi)方式不怎么常用。(一些中性詞會(huì)干擾分類(lèi))
TF-IDF
TF-IDF的主要思想:如果某個(gè)詞或短語(yǔ)在一篇文章中出現(xiàn)的概率高,并且在其它文章中很少出現(xiàn),則認(rèn)為此詞或者短語(yǔ)具有很好的類(lèi)別區(qū)分能力,適合用來(lái)分類(lèi)。
TF-IDF作用:用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度。
樸素貝葉斯
tf idf —— tf*idf——重要性程度
tf: term frequency 詞的頻率 出現(xiàn)的次數(shù)
idf: inverse document frequency 逆文檔頻率 log(總文檔數(shù)量/該詞出現(xiàn)的文檔數(shù)量)
TfidfVectorizer語(yǔ)法
TfidfVectorizer(stop_words=None,…)返回詞的權(quán)重矩陣TfidfVectorizer.fit_transform(X)X:文本或者包含文本字符串的可迭代對(duì)象返回值:返回spars矩陣TfidfVectorizer.inverse_transform(X)X:array數(shù)組或者sparse矩陣返回值:轉(zhuǎn)換之前數(shù)據(jù)格式TfidfVectorizer.get_feature_names()返回值:單詞列表為什么需要TfidfVectorizer?
答:分類(lèi)是機(jī)器學(xué)習(xí)算法的重要依據(jù)。
5.數(shù)據(jù)的特征預(yù)處理
對(duì)數(shù)據(jù)進(jìn)行處理。
特征預(yù)處理是什么?
通過(guò)特定的統(tǒng)計(jì)方法(數(shù)學(xué)方法)將數(shù)據(jù)轉(zhuǎn)換成算法要求的數(shù)據(jù)。
數(shù)值型數(shù)據(jù):標(biāo)準(zhǔn)縮放:1.歸一化。2.標(biāo)準(zhǔn)化。3.缺失值。
類(lèi)別型數(shù)據(jù):one-hot編碼
時(shí)間類(lèi)型:時(shí)間的切分
1.特征預(yù)處理的方法
2.sklearn特征預(yù)處理API——sklearn.preprocessing
(1)線性歸一化。
也稱(chēng)min-max標(biāo)準(zhǔn)化、離差標(biāo)準(zhǔn)化;是對(duì)原始數(shù)據(jù)的線性變換,使得結(jié)果值映射到[0,1]之間。
特點(diǎn):通過(guò)對(duì)原始數(shù)據(jù)進(jìn)行變換把數(shù)據(jù)映射到(默認(rèn)為[0,1])之間。
目的:使得某一個(gè)特征對(duì)最終結(jié)果不會(huì)造成更大影響。
轉(zhuǎn)換函數(shù)如下:
MinMaxScaler語(yǔ)法
歸一化步驟
1、實(shí)例化MinMaxScalar
2、通過(guò)fit_transform轉(zhuǎn)換
演示:
from sklearn.preprocessing import MinMaxScalerdef mm():'''歸一化處理:return: None'''mm=MinMaxScaler()data=mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])print(data)if __name__=='__main__':mm()
這種歸一化比較適用在數(shù)值較集中的情況。這種方法有一個(gè)缺陷,異常點(diǎn)對(duì)最值影響太大,如果max和min不穩(wěn)定的時(shí)候,很容易使得歸一化的結(jié)果不穩(wěn)定,影響后續(xù)使用效果。其實(shí)在實(shí)際應(yīng)用中,一般用經(jīng)驗(yàn)常量來(lái)替代max和min。
對(duì)于歸一化來(lái)說(shuō):如果出現(xiàn)異常點(diǎn),影響了最大值和最小值,那么結(jié)果顯然會(huì)發(fā)生改變。
(2)標(biāo)準(zhǔn)差歸一化。
特點(diǎn):通過(guò)對(duì)原始數(shù)據(jù)進(jìn)行變換把數(shù)據(jù)變換到均值為0,方差為1范圍內(nèi)。
也叫Z-score標(biāo)準(zhǔn)化,這種方法給予原始數(shù)據(jù)的均值(mean,μ)和標(biāo)準(zhǔn)差(standard deviation,σ)進(jìn)行數(shù)據(jù)的標(biāo)準(zhǔn)化。經(jīng)過(guò)處理后的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布,即均值為0,標(biāo)準(zhǔn)差為1,轉(zhuǎn)化函數(shù)為:
StandardScaler語(yǔ)法
標(biāo)準(zhǔn)化步驟
1、實(shí)例化StandardScaler
2、通過(guò)fit_transform轉(zhuǎn)換
演示:
from sklearn.preprocessing import StandardScalerdef stand():'''標(biāo)準(zhǔn)化縮放:return:'''std=StandardScaler()data=std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])print(data)return Noneif __name__=='__main__':stand()
對(duì)于標(biāo)準(zhǔn)化來(lái)說(shuō):如果出現(xiàn)異常點(diǎn),由于具有一定數(shù)據(jù)量,少量的異常點(diǎn)對(duì)于平均值的影響并不大,從而方差改變較小。
(3)缺失值
如何處理數(shù)據(jù)中的缺失值?
Imputer語(yǔ)法
Imputer流程
1、初始化Imputer,指定”缺失值”,指定填補(bǔ)策略,指定行或列
注:缺失值也可以是別的指定要替換的值
2、調(diào)用fit_transform
演示:
from sklearn.preprocessing import Imputer import numpy as npdef im():'''缺失值處理:return:'''im=Imputer(missing_values='NaN',strategy='mean',axis=0)data=im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])print(data)return Noneif __name__=='__main__':im()關(guān)于np.nan(np.NaN)
1、 numpy的數(shù)組中可以使用np.nan/np.NaN來(lái)代替缺失值,屬于float類(lèi)型。
2、如果是文件中的一些缺失值,可以替換成nan,通過(guò)np.array轉(zhuǎn)化成float型的數(shù)組即可。
(4)非線性歸一化,這種方法一般使用在數(shù)據(jù)分析比較大的場(chǎng)景,有些數(shù)值很大,有些很小,通過(guò)一些數(shù)學(xué)函數(shù),將原始值進(jìn)行映射。一般使用的函數(shù)包括log、指數(shù)、正切等,需要根據(jù)數(shù)據(jù)分布的具體情況來(lái)決定非線性函數(shù)的曲線。
總結(jié)
以上是生活随笔為你收集整理的python人工智能——机器学习——特征工程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 编程求一个后缀表达式的值
- 下一篇: python人工智能——机器学习——数据