一、什么是特征預(yù)處理
通過一些轉(zhuǎn)換函數(shù)將特征數(shù)據(jù)轉(zhuǎn)換成更加適合算法模型的特征數(shù)據(jù)過程
處理前,特征值是數(shù)值,處理后,進行了特征縮放
1、包含內(nèi)容
數(shù)值型數(shù)據(jù)的無量綱化:
歸一化
標準化
2、特征預(yù)處理API
sklearn.preprocessing
3、為什么我們要進行歸一化/標準化
特征的單位或者大小相差較大,或者某特征的方差相比其他的特征要大出幾個數(shù)量級,容易影響(支配)目標結(jié)果,使得一些算法無法學(xué)習到其它的特征
因為很多數(shù)據(jù)量綱不一致
可以看到里程數(shù)數(shù)值比較大,消耗時間比數(shù)值比較小
用KNN算法計算歐氏距離公式時,最終結(jié)果被里程數(shù)左右,學(xué)習不到其他特征了
(72993 - 35948) ^ 2 + (10.14 - 6.83) ^ 2 + (1.03 - 1.21) ^ 2
我們需要用到一些方法進行無量綱化,使不同規(guī)格的數(shù)據(jù)轉(zhuǎn)換到同一規(guī)格
4、什么是歐氏距離公式
5、無量綱化
之所以要做無量綱化的處理,就是因為量綱不統(tǒng)一,導(dǎo)致了里程數(shù)數(shù)值非常的大。為了讓特征同等重要,要做歸一化/標準化
二、歸一化
1、定義
通過對原始數(shù)據(jù)進行變換把數(shù)據(jù)映射到(默認為[0,1])之間
2、公式
3、API函數(shù)
sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1)...)
4、MinMaxScaler.fit_transform(X)
X:numpy array格式的數(shù)據(jù)[n_samples, n_features]
n_samples:有幾行數(shù)據(jù),樣本數(shù)
n_features:有幾個特征,有幾列
返回值:轉(zhuǎn)換后的形狀相同的array
5、歸一化處理dating.txt中的數(shù)據(jù)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler
import jieba
import pandas as pd
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer(sparse=False)
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
def count_demo():
"""
文本特征抽取
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def count_chinese_demo():
"""
中文文本特征抽取
"""
data = ["我 愛 北京 天安門", "天安門 上 太陽 升"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray());
print("特征名字:\n", transfer.get_feature_names())
return None
def cut_word(text):
"""
進行中文分詞
"""
return " ".join(list(jieba.cut(text))) #返回一個分詞生成器對象,強轉(zhuǎn)成list,再join轉(zhuǎn)成字符串
def count_chinese_demo2():
"""
中文文本特征抽取,自動分詞
"""
# 1、將中文文本進行分詞
data = ["今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
"我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,這樣當我們看到宇宙時,我們是在看它的過去。",
"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 3、調(diào)用fit_transform()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def tfidf_demo():
"""
用tf-idf的方法進行文本特征抽取
"""
# 1、將中文文本進行分詞
data = ["今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
"我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,這樣當我們看到宇宙時,我們是在看它的過去。",
"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、實例化一個轉(zhuǎn)換器類
transfer = TfidfVectorizer()
# 3、調(diào)用fit_transform()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def minmax_demo():
"""
歸一化
"""
# 1、獲取數(shù)據(jù)
data = pd.read_csv("dating.txt")
#print("data:\n", data)
data = data.iloc[:, 0:3] #行都要,列取前3列
print("data:\n", data)
# 2、實例化一個轉(zhuǎn)換器
transfer = MinMaxScaler()
# 3、調(diào)用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
#dict_demo()
# 代碼3:文本特征抽取
#count_demo()
# 代碼4:中文文本特征抽取
#count_chinese_demo()
# 代碼5:中文文本特征抽取,自動分詞
#count_chinese_demo2()
# 代碼6: 測試jieba庫中文分詞
#print(cut_word("我愛北京天安門"))
# 代碼7:用tf-idf的方法進行文本特征抽取
#tfidf_demo()
# 代碼8:歸一化
minmax_demo()
運行結(jié)果:
data:
milage liters consumtime
0 40920 8.326976 0.953952
1 14488 7.153469 1.673904
2 26052 1.441871 0.805124
3 75136 13.147394 0.428964
4 38344 1.669788 0.134296
.. ... ... ...
984 11145 3.410627 0.631838
985 68846 9.974715 0.669787
986 26575 10.650102 0.866627
987 48111 9.134528 0.728045
988 43757 7.882601 1.332446
[989 rows x 3 columns]
data_new:
[[0.44832535 0.39805139 0.56233353]
[0.15873259 0.34195467 0.98724416]
[0.28542943 0.06892523 0.47449629]
...
[0.29115949 0.50910294 0.51079493]
[0.52711097 0.43665451 0.4290048 ]
[0.47940793 0.3768091 0.78571804]]
三、標準化
1、歸一化有什么缺點
歸一化結(jié)果是根據(jù)最小值和最大值求出來的,如果數(shù)據(jù)中異常點較多,最大值和最小值非常容易受異常點影響
所以這種方法魯棒性(健壯性)較差,只適合傳統(tǒng)精確小數(shù)據(jù)場景
2、定義
通過對原始數(shù)據(jù)進行變換把數(shù)據(jù)變換到均值為0,標準差為1范圍內(nèi)
3、公式
用數(shù)據(jù)減去這一列的平均值,除以標準差
4、什么是標準差
5、API函數(shù)
sklearn.preprocessing.StandardScaler()
處理后,對每列來說,所有數(shù)據(jù)都聚集在均值為0附近,標準差為1
6、StandardScaler.fit_transform(X)
X:numpy array格式的數(shù)據(jù)[n_samples, n_features]
返回值:轉(zhuǎn)換后的形狀相同的array
7、標準化處理dating.txt中的數(shù)據(jù)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import jieba
import pandas as pd
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer(sparse=False)
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
def count_demo():
"""
文本特征抽取
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def count_chinese_demo():
"""
中文文本特征抽取
"""
data = ["我 愛 北京 天安門", "天安門 上 太陽 升"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray());
print("特征名字:\n", transfer.get_feature_names())
return None
def cut_word(text):
"""
進行中文分詞
"""
return " ".join(list(jieba.cut(text))) #返回一個分詞生成器對象,強轉(zhuǎn)成list,再join轉(zhuǎn)成字符串
def count_chinese_demo2():
"""
中文文本特征抽取,自動分詞
"""
# 1、將中文文本進行分詞
data = ["今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
"我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,這樣當我們看到宇宙時,我們是在看它的過去。",
"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 3、調(diào)用fit_transform()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def tfidf_demo():
"""
用tf-idf的方法進行文本特征抽取
"""
# 1、將中文文本進行分詞
data = ["今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
"我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,這樣當我們看到宇宙時,我們是在看它的過去。",
"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、實例化一個轉(zhuǎn)換器類
transfer = TfidfVectorizer()
# 3、調(diào)用fit_transform()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def minmax_demo():
"""
歸一化
"""
# 1、獲取數(shù)據(jù)
data = pd.read_csv("dating.txt")
#print("data:\n", data)
data = data.iloc[:, 0:3] #行都要,列取前3列
print("data:\n", data)
# 2、實例化一個轉(zhuǎn)換器
transfer = MinMaxScaler()
# 3、調(diào)用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
def stand_demo():
"""
標準化
"""
# 1、獲取數(shù)據(jù)
data = pd.read_csv("dating.txt")
#print("data:\n", data)
data = data.iloc[:, 0:3] #行都要,列取前3列
print("data:\n", data)
# 2、實例化一個轉(zhuǎn)換器
transfer = StandardScaler()
# 3、調(diào)用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
#dict_demo()
# 代碼3:文本特征抽取
#count_demo()
# 代碼4:中文文本特征抽取
#count_chinese_demo()
# 代碼5:中文文本特征抽取,自動分詞
#count_chinese_demo2()
# 代碼6: 測試jieba庫中文分詞
#print(cut_word("我愛北京天安門"))
# 代碼7:用tf-idf的方法進行文本特征抽取
#tfidf_demo()
# 代碼8:歸一化
#minmax_demo()
# 代碼9:標準化
stand_demo()
運行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-625581.html
data:
milage liters consumtime
0 40920 8.326976 0.953952
1 14488 7.153469 1.673904
2 26052 1.441871 0.805124
3 75136 13.147394 0.428964
4 38344 1.669788 0.134296
.. ... ... ...
984 11145 3.410627 0.631838
985 68846 9.974715 0.669787
986 26575 10.650102 0.866627
987 48111 9.134528 0.728045
988 43757 7.882601 1.332446
[989 rows x 3 columns]
data_new:
[[ 0.33984938 0.42024644 0.2460588 ]
[-0.86581884 0.14356328 1.69344575]
[-0.338339 -1.2030865 -0.05314407]
...
[-0.31448289 0.96798056 0.07050117]
[ 0.66785937 0.61064669 -0.2081032 ]
[ 0.46925618 0.31547409 1.00698075]]
8、標準化小結(jié)
在已有樣本足夠多的情況下比較穩(wěn)定,適合現(xiàn)代嘈雜大數(shù)據(jù)場景
?文章來源地址http://www.zghlxwxcb.cn/news/detail-625581.html
到了這里,關(guān)于機器學(xué)習基礎(chǔ)之《特征工程(3)—特征預(yù)處理》的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!