目錄
- sklearn數據集
- 玩具數據集
- 現實世界數據集
- 加載玩具數據集
- 獲取現實世界數據集
- 本地csv數據
- 創建csv文件
- pandas加載csv
- 數據集劃分
- 特征工程
- 步驟
- 特征工程API
- DictVectorizer 字典列表特征提取
- API
- CountVectorizer 文本特征提取
- API
- 英文文本提取
- 中文文本提取
- TfidfVectorizer TF-IDF文本特征詞的重要程度特征提取
- 算法
- API
- 示例
- 無量綱化-預處理
- MinMaxScaler 歸一化
- normalize歸一化
- StandardScaler 標準化
- 注意點
sklearn數據集
玩具數據集
數據量小,數據在sklearn庫的本地,只要安裝了sklearn,不用上網就可以獲取
現實世界數據集
數據量大,數據只能通過網絡獲取
加載玩具數據集
示例:鳶尾花數據
from sklearn.datasets import load_iris
iris = load_iris() #鳶尾花數據 #返回一個Bunch對象
iris字典中有幾個重要屬性:
# data 特征
# feature_names 特征描述
# target 目標
# target_names 目標描述
# DESCR 數據集的描述
# filename 下后到本地保存后的文件名
鳶尾花數據集介紹
特征有:
? 花萼長 sepal length
? 花萼寬sepal width
? 花瓣長 petal length
? 花瓣寬 petal width
三分類:
? 0-Setosa山鳶尾
? 1-versicolor變色鳶尾
? 2-Virginica維吉尼亞鳶尾
獲取現實世界數據集
(1)所有現實世界數據,通過網絡才能下載后,默認保存的目錄可以使用下面api獲取。實際上就是保存到home目錄
from sklearn import datasets
datasets.get_data_home() #查看數據集默認存放的位置
(2)下載時,有可能回為網絡問題而出問題,要“小心”的解決網絡問題,不可言……
(3)第一次下載會保存的硬盤中,如果第二次下載,因為硬盤中已經保存有了,所以不會再次下載就直接加載成功了。
示例:獲取20分類新聞數據
(1)使用函數: sklearn.datasets.fetch_20newsgroups(data_home,subset)
(2)函數參數說明:
- data_home
None這是默認值,下載的文件路徑為 “C:/Users/ADMIN/scikit_learn_data/20news-bydate_py3.pkz”
自定義路徑例如 “./src”, 下載的文件路徑為“./20news-bydate_py3.pkz”
- subset
“train”,只下載訓練集
“test”,只下載測試集
“all”, 下載的數據包含了訓練集和測試集
- return_X_y,決定著返回值的情況
False,這是默認值
True,
函數返值說明:
當參數return_X_y值為False時, 函數返回Bunch對象,Bunch對象中有以下屬性*data:特征數據集, 長度為18846的列表list, 每一個元素就是一篇新聞內容, 共有18846篇*target:目標數據集,長度為18846的數組ndarray, 第一個元素是一個整數,整數值為[0,20)*target_names:目標描述,長度為20的list*filenames:長度為18846的ndarray, 元素為字符串,代表新聞的數據位置的路徑當參數return_X_y值為True時,函數返回值為元組,元組長度為2, 第一個元素值為特征數據集,第二個元素值為目標數據集
- 代碼
from sklearn.datasets import fetch_20newsgroups #這是一個20分類的數據
news = fetch_20newsgroups(data_home=None,subset='all')
print(len(news.data)) #18846
print(news.target.shape) #(18846,)
print(len(news.target_names)) #20
print(len(news.filenames)) #18846
本地csv數據
創建csv文件
- 方式1:打開計事本,寫出如下數據,數據之間使用英文下的逗號, 保存文件后把后綴名改為csv
csv文件可以使用excel打開
, milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
- 方式2:創建excel 文件, 填寫數據,以csv為后綴保存文件
pandas加載csv
使用pandas的read_csv(“文件路徑”)函數可以加載csv文件,得到的結果為數據的DataFrame形式
pd.read_csv("./src/ss.csv")
數據集劃分
**sklearn.model_selection.train_test_split(*arrays,options)
參數
(1) *array 這里用于接收1到多個"列表、numpy數組、稀疏矩陣或padas中的DataFrame"。
(2) **options, 重要的關鍵字參數有:test_size 值為0.0到1.0的小數,表示劃分后測試集占的比例random_state 值為任意整數,表示隨機種子,使用相同的隨機種子對相同的數據集多次劃分結果是相同的。否則多半不同strxxxx 分層劃分,填y
2 返回值說明返回值為列表list, 列表長度與形參array接收到的參數數量相關聯, 形參array接收到的是什么類型,list中對應被劃分出來的兩部分就是什么類型
特征工程
特征工程是將任意數據(如文本或圖像)轉換為可用于機器學習的數字特征,比如:字典特征提取(特征離散化)、文本特征提取、圖像特征提取。
步驟
-
特征提取, 如果不是像dataframe那樣的數據,要進行特征提取,比如字典特征提取,文本特征提取
-
無量綱化(預處理)
- 歸一化
- 標準化
-
降維
-
底方差過濾特征選擇
-
主成分分析-PCA降維
-
特征工程API
- 實例化轉換器對象,轉換器類有很多,都是Transformer的子類, 常用的子類有:
DictVectorizer 字典特征提取
CountVectorizer 文本特征提取
TfidfVectorizer TF-IDF文本特征詞的重要程度特征提取
MinMaxScaler 歸一化
StandardScaler 標準化
VarianceThreshold 底方差過濾降維
PCA 主成分分析降維
- 轉換器對象調用fit_transform()進行轉換, 其中fit用于計算數據,transform進行最終轉換
fit_transform()可以使用fit()和transform()代替
data_new = transfer.fit_transform(data)
可寫成
transfer.fit(data)
data_new = transfer.transform(data)
DictVectorizer 字典列表特征提取
稀疏矩陣
稀疏矩陣是指一個矩陣中大部分元素為零,只有少數元素是非零的矩陣。
由于稀疏矩陣中零元素非常多,存儲和處理稀疏矩陣時,通常會采用特殊的存儲格式,以節省內存空間并提高計算效率。
三元組表 (Coordinate List, COO):三元組表就是一種稀疏矩陣類型數據,存儲非零元素的行索引、列索引和值:
(行,列) 數據
(0,0) 10
(0,1) 20
(2,0) 90
(2,20) 8
(8,0) 70
表示除了列出的有值, 其余全是0
非稀疏矩陣(稠密矩陣)
非稀疏矩陣,或稱稠密矩陣,是指矩陣中非零元素的數量與總元素數量相比接近或相等,也就是說矩陣中的大部分元素都是非零的。在這種情況下,矩陣的存儲通常采用標準的二維數組形式,因為非零元素密集分布,不需要特殊的壓縮或優化存儲策略。
API
-
創建轉換器對象:
sklearn.feature_extraction.DictVectorizer(sparse=True)
參數:
sparse=True返回類型為csr_matrix的稀疏矩陣
sparse=False表示返回的是數組,數組可以調用.toarray()方法將稀疏矩陣轉換為數組
-
轉換器對象:
轉換器對象調用fit_transform(data)函數,參數data為一維字典數組或一維字典列表,返回轉化后的矩陣或數組
轉換器對象get_feature_names_out()方法獲取特征名
CountVectorizer 文本特征提取
API
sklearn.feature_extraction.text.CountVectorizer
? 構造函數關鍵字參數stop_words,值為list,表示詞的黑名單(不提取的詞)
fit_transform函數的返回值為稀疏矩陣
英文文本提取
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pddata=["stu is well, stu is great", "You like stu"]#創建轉換器對象, you和is不提取
transfer = CountVectorizer(stop_words=["you","is"])#進行提取,得到稀疏矩陣
data_new = transfer.fit_transform(data)
print(data_new)import pandas
pandas.DataFrame(data_new.toarray(), index=["第一個句子","第二個句子"],columns=transfer.get_feature_names_out())
中文文本提取
a.中文文本不像英文文本,中文文本文字之間沒有空格,所以要先分詞,一般使用jieba分詞.
b.下載jieba組件, (不要使用conda)
c.jieba的基礎
import jieba
from sklearn.feature_extraction.text import CountVectorizerdef cut(text):return " ".join(list(jieba.cut(text)))data = ["教育學會會長期間堅定支持民辦教育事業!","熱忱關心、扶持民辦學校發展","事業做出重大貢獻!"]
data_new = [cut(v) for v in data]transfer = CountVectorizer(stop_words=['期間', '做出'])
data_final = transfer.fit_transform(data_new)print(data_final.toarray())#把非稀疏矩陣轉變為稀疏矩陣
print(transfer.get_feature_names_out())#import pandas as pd
pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())
TfidfVectorizer TF-IDF文本特征詞的重要程度特征提取
算法
詞頻(Term Frequency, TF), 表示一個詞在當前篇文章中的重要性
逆文檔頻率(Inverse Document Frequency, IDF), 反映了詞在整個文檔集合中的稀有程度
API
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])
? 構造函數關鍵字參數stop_words,表示詞特征黑名單
fit_transform函數的返回值為稀疏矩陣
示例
代碼與CountVectorizer的示例基本相同,僅僅把CountVectorizer改為TfidfVectorizer即可
示例中data是一個字符串list, list中的第一個元素就代表一篇文章.
import jieba
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizerdef cut_words(text):return " ".join(list(jieba.cut(text)))data = ["教育學會會長期間,堅定支持民辦教育事業!", "扶持民辦,學校發展事業","事業做出重大貢獻!"]
data_new = [cut_words(v) for v in data]transfer = TfidfVectorizer(stop_words=['期間', '做出',"重大貢獻"])
data_final = transfer.fit_transform(data_new)pd.DataFrame(data_final.toarray(),columns=transfer.get_feature_names_out())
補充:在sklearn庫中 TF-IDF算法做了一些細節的優化
詞頻 (TF)
詞頻是指一個詞在文檔中出現的頻率。通常有兩種計算方法:
- 原始詞頻:一個詞在文檔中出現的次數除以文檔中總的詞數。
- 平滑后的詞頻:為了防止高頻詞主導向量空間,有時會對詞頻進行平滑處理,例如使用
1 + log(TF)
。 - 在 TfidfVectorizer 中,TF 默認是:直接使用一個詞在文檔中出現的次數也就是CountVectorizer的結果
逆文檔頻率 (IDF)
逆文檔頻率衡量一個詞的普遍重要性。如果一個詞在許多文檔中都出現,那么它的重要性就會降低。
IDF 的計算公式是:
IDF(t)=log??(總文檔數包含詞t的文檔數+1)IDF(t)=\log?(\dfrac{總文檔數}{包含詞t的文檔數+1})IDF(t)=log?(包含詞t的文檔數+1總文檔數?)
在 TfidfVectorizer 中,IDF 的默認計算公式是:
IDF(t)=log??(總文檔數+1包含詞t的文檔數+1)+1IDF(t)=\log?(\dfrac{總文檔數+1}{包含詞t的文檔數+1})+1IDF(t)=log?(包含詞t的文檔數+1總文檔數+1?)+1
在 TfidfVectorizer 中還會進行歸一化處理(采用的L2歸一化)
L2歸一化
x1歸一化后的數據=x1x12+x22+...xn2x_1歸一化后的數據=\dfrac{x_1}{\sqrt{x_1^2+x_2^2+...x_n^2}}x1?歸一化后的數據=x12?+x22?+...xn2??x1??
x可以選擇是行或者列的數據
無量綱化-預處理
無量綱,即沒有單位的數據
無量綱化包括"歸一化"和"標準化", 為什么要進行無量綱化呢?
這是一個男士的數據表:
編號id | 身高 h | 收入 s | 體重 w |
---|---|---|---|
1 | 1.75(米) | 15000(元) | 120(斤) |
2 | 1.5(米) | 16000(元) | 140(斤) |
3 | 1.6(米) | 20000(元) | 100(斤) |
假設算法中需要求它們之間的歐式距離, 這里以編號1和編號2為示例:
L=(1.75?1.5)2+(15000?16000)2+(120?140)2L = \sqrt{(1.75-1.5)^2+(15000-16000)^2+(120-140)^2}L=(1.75?1.5)2+(15000?16000)2+(120?140)2?
從計算上來看, 發現身高對計算結果沒有什么影響, 基本主要由收入來決定了,但是現實生活中,身高是比較重要的判斷標準. 所以需要無量綱化.
MinMaxScaler 歸一化
通過對原始數據進行變換把數據映射到指定區間(默認為0-1)
sklearn.preprocessing.MinMaxScaler(feature_range)
參數:feature_range=(0,1) 歸一化后的值域,可以自己設定
fit_transform函數歸一化的原始數據類型可以是list、DataFrame和ndarray, 不可以是稀疏矩陣
fit_transform函數的返回值為ndarray
這里的 𝑥min 和 𝑥max 分別是每種特征中的最小值和最大值,而 𝑥是當前特征值,𝑥scaled 是歸一化后的特征值。
若要縮放到其他區間,可以使用公式:x=x*(max-min)+min;
比如 [-1, 1]的公式為:
normalize歸一化
from sklearn.preprocessing import normalize
normalize(data, norm=‘l2’, axis=1)
#data是要歸一化的數據
#norm是使用那種歸一化:“l1” “l2” "max
#axis=0是列 axis=1是行
- <1> L1歸一化
絕對值相加作為分母,特征值作為分子 - L2歸一化
平方相加作為分母,特征值作為分子 - <3> max歸一化
max作為分母,特征值作為分子
StandardScaler 標準化
標準化是一種數據預處理技術,也稱為數據歸一化或特征縮放。它的目的是將不同特征的數值范圍縮放到統一的標準范圍,以便更好地適應一些機器學習算法,特別是那些對輸入數據的尺度敏感的算法。
sklearn.preprocessing.StandardScale
與MinMaxScaler一樣,原始數據類型可以是list、DataFrame和ndarray
fit_transform函數的返回值為ndarray, 歸一化后得到的數據類型都是ndarray
from sklearn.preprocessing import StandardScaler
#不能加參數feature_range=(0, 1)
transfer = StandardScaler()
data_new = transfer.fit_transform(data) #data_new的類型為ndarray
最常見的標準化方法是Z-score標準化,也稱為零均值標準化。它通過對每個特征的值減去其均值,再除以其標準差,將數據轉換為均值為0,標準差為1的分布。這可以通過以下公式計算:
其中,z是轉換后的數值,x是原始數據的值,μ是該特征的均值,σ是該特征的 標準差
注意點
在數據預處理中,特別是使用如StandardScaler
這樣的數據轉換器時,fit
、fit_transform
和transform
這三個方法的使用是至關重要的,它們各自有不同的作用:
- fit:
- 這個方法用來計算數據的統計信息,比如均值和標準差(在
StandardScaler
的情況下)。這些統計信息隨后會被用于數據的標準化。 - 你應當僅在訓練集上使用
fit
方法。
- 這個方法用來計算數據的統計信息,比如均值和標準差(在
- fit_transform:
- 這個方法相當于先調用
fit
再調用transform
,但是它在內部執行得更高效。 - 它同樣應當僅在訓練集上使用,它會計算訓練集的統計信息并立即應用到該訓練集上。
- 這個方法相當于先調用
- transform:
- 這個方法使用已經通過
fit
方法計算出的統計信息來轉換數據。 - 它可以應用于任何數據集,包括訓練集、驗證集或測試集,但是應用時使用的統計信息必須來自于訓練集。
- 這個方法使用已經通過
當你在預處理數據時,首先需要在訓練集X_train
上使用fit_transform
,這樣做可以一次性完成統計信息的計算和數據的標準化。這是因為我們需要確保模型是基于訓練數據的統計信息進行學習的,而不是整個數據集的統計信息。
**一旦scaler
對象在X_train
上被fit
,它就已經知道了如何將數據標準化。**這時,對于測試集X_test
,我們只需要使用transform
方法,因為我們不希望在測試集上重新計算任何統計信息,也不希望測試集的信息影響到訓練過程。如果我們對X_test
也使用fit_transform
,測試集的信息就可能會影響到訓練過程。
總結來說:我們常常是先fit_transform(x_train)然后再transform(x_text)