Python scikit-learn數(shù)據(jù)預(yù)處理常見(jiàn)方法和步驟
數(shù)據(jù)預(yù)處理常見(jiàn)方法和步驟
數(shù)據(jù)預(yù)處理是數(shù)據(jù)準(zhǔn)備階段的一個(gè)重要環(huán)節(jié),主要目的是將原始數(shù)據(jù)轉(zhuǎn)換成適合機(jī)器學(xué)習(xí)模型使用的格式,同時(shí)處理數(shù)據(jù)中的缺失值、異常值、重復(fù)值、不一致性等問(wèn)題。數(shù)據(jù)預(yù)處理可以顯著提高機(jī)器學(xué)習(xí)模型的性能和準(zhǔn)確度。
以下是一些常見(jiàn)的數(shù)據(jù)預(yù)處理步驟:
缺失值處理:
- 刪除含有缺失值的記錄。
- 用某個(gè)統(tǒng)計(jì)值(如均值、中位數(shù)、眾數(shù))填充缺失值。
- 使用算法(如K-近鄰、決策樹(shù)等)預(yù)測(cè)缺失值。
異常值檢測(cè)與處理:
- 使用統(tǒng)計(jì)方法(如Z-score、IQR法則)檢測(cè)異常值。
- 根據(jù)業(yè)務(wù)需求決定是刪除、替換或保留異常值。
數(shù)據(jù)標(biāo)準(zhǔn)化/歸一化:
- 標(biāo)準(zhǔn)化(Z-score標(biāo)準(zhǔn)化):將數(shù)據(jù)轉(zhuǎn)換為均值為0,標(biāo)準(zhǔn)差為1的分布。
- 歸一化(Min-Max歸一化):將數(shù)據(jù)縮放到[0,1]或[-1,1]的范圍內(nèi)。
編碼分類(lèi)變量:
- 獨(dú)熱編碼(One-Hot Encoding):將分類(lèi)變量轉(zhuǎn)換為二進(jìn)制列。
- 標(biāo)簽編碼(Label Encoding):將分類(lèi)變量轉(zhuǎn)換為整數(shù)。
- 順序編碼(Ordinal Encoding):針對(duì)有序的分類(lèi)變量,將其轉(zhuǎn)換為整數(shù),保留順序信息。
特征選擇和降維:
- 使用統(tǒng)計(jì)測(cè)試、模型權(quán)重等方法選擇重要的特征。
- 使用PCA、t-SNE等方法進(jìn)行降維,減少特征的復(fù)雜性。
數(shù)據(jù)變換:
- 對(duì)數(shù)變換、Box-Cox變換等,用于穩(wěn)定方差或使數(shù)據(jù)更接近正態(tài)分布。
- 多項(xiàng)式特征生成,用于捕捉非線性關(guān)系。
數(shù)據(jù)劃分:
- 將數(shù)據(jù)集劃分為訓(xùn)練集、驗(yàn)證集和測(cè)試集,以評(píng)估模型的性能和泛化能力。
處理不平衡數(shù)據(jù):
- 過(guò)采樣少數(shù)類(lèi)(如SMOTE算法)。
- 欠采樣多數(shù)類(lèi)。
- 使用合成樣本技術(shù)或代價(jià)敏感學(xué)習(xí)來(lái)處理不平衡問(wèn)題。
文本數(shù)據(jù)預(yù)處理:
- 去除停用詞、標(biāo)點(diǎn)符號(hào)和特殊字符。
- 詞干提取(stemming)或詞形還原(lemmatization)。
- 文本向量化,如詞袋模型、TF-IDF等。
時(shí)間序列數(shù)據(jù)預(yù)處理:
- 日期和時(shí)間特征的提取,如年、月、日、小時(shí)等。
- 時(shí)間序列的平穩(wěn)化處理,如差分、對(duì)數(shù)變換等。
- 季節(jié)性分解、趨勢(shì)分解等。
數(shù)據(jù)預(yù)處理的具體步驟應(yīng)根據(jù)數(shù)據(jù)集的特性、業(yè)務(wù)需求和所選模型的要求來(lái)確定。預(yù)處理后的數(shù)據(jù)應(yīng)能更好地反映潛在的數(shù)據(jù)結(jié)構(gòu)和模式,從而提高機(jī)器學(xué)習(xí)模型的預(yù)測(cè)性能。
示例:數(shù)據(jù)預(yù)處理簡(jiǎn)單代碼
當(dāng)然,以下是一個(gè)簡(jiǎn)單的數(shù)據(jù)預(yù)處理示例代碼,使用Python的Pandas庫(kù)來(lái)處理一個(gè)假設(shè)的數(shù)據(jù)集。這個(gè)示例將涵蓋一些基本的數(shù)據(jù)預(yù)處理步驟,如缺失值處理、數(shù)據(jù)標(biāo)準(zhǔn)化和編碼分類(lèi)變量。
import pandas as pd from sklearn.preprocessing import StandardScaler, OneHotEncoder import numpy as np # 假設(shè)我們有一個(gè)包含缺失值、數(shù)值特征和分類(lèi)特征的DataFrame data = { 'Age': [25, np.nan, 35, 45, 55], 'Salary': [50000, 60000, np.nan, 80000, 90000], 'Gender': ['Male', 'Female', 'Male', 'Male', 'Female'], 'MaritalStatus': ['Married', 'Single', 'Married', 'Single', 'Married'] } df = pd.DataFrame(data) # 處理缺失值:使用均值填充 df['Age'].fillna(df['Age'].mean(), inplace=True) df['Salary'].fillna(df['Salary'].mean(), inplace=True) # 數(shù)據(jù)標(biāo)準(zhǔn)化:對(duì)Age和Salary進(jìn)行標(biāo)準(zhǔn)化 scaler = StandardScaler() df[['Age', 'Salary']] = scaler.fit_transform(df[['Age', 'Salary']]) # 編碼分類(lèi)變量:使用獨(dú)熱編碼處理Gender和MaritalStatus encoder = OneHotEncoder(sparse=False) encoded_gender = encoder.fit_transform(df[['Gender']]) encoded_marital = encoder.fit_transform(df[['MaritalStatus']]) # 將編碼后的數(shù)據(jù)轉(zhuǎn)換為DataFrame并添加到原始DataFrame中 df_gender = pd.DataFrame(encoded_gender, columns=[f"Gender_{str(i)}" for i in range(encoded_gender.shape[1])]) df_marital = pd.DataFrame(encoded_marital, columns=[f"MaritalStatus_{str(i)}" for i in range(encoded_marital.shape[1])]) # 刪除原始的分類(lèi)列 df.drop(['Gender', 'MaritalStatus'], axis=1, inplace=True) # 合并編碼后的數(shù)據(jù)列 df = pd.concat([df, df_gender, df_marital], axis=1) print(df)
在這個(gè)示例中,我們首先創(chuàng)建了一個(gè)包含數(shù)值特征(Age, Salary)和分類(lèi)特征(Gender, MaritalStatus)的假設(shè)數(shù)據(jù)集,并且這個(gè)數(shù)據(jù)集中包含了一些缺失值。然后,我們按照以下步驟進(jìn)行了數(shù)據(jù)預(yù)處理:
- 使用均值填充了缺失值。
- 使用
StandardScaler
對(duì)數(shù)值特征進(jìn)行了標(biāo)準(zhǔn)化。 - 使用
OneHotEncoder
對(duì)分類(lèi)特征進(jìn)行了獨(dú)熱編碼。 - 刪除了原始的分類(lèi)列,并將編碼后的列添加到了DataFrame中。
請(qǐng)注意,這個(gè)示例是為了展示數(shù)據(jù)預(yù)處理的基本步驟,實(shí)際應(yīng)用中可能需要根據(jù)數(shù)據(jù)的特性和業(yè)務(wù)需求進(jìn)行相應(yīng)的調(diào)整。
主要步驟詳解
1、使用統(tǒng)計(jì)方法(如Z-score、IQR法則)檢測(cè)異常值。
在數(shù)據(jù)分析中,異常值檢測(cè)是一個(gè)重要步驟,因?yàn)樗梢詭椭覀冏R(shí)別出那些可能由于數(shù)據(jù)錄入錯(cuò)誤、測(cè)量誤差或其他異常原因而產(chǎn)生的不合理數(shù)據(jù)點(diǎn)。這些異常值可能會(huì)對(duì)數(shù)據(jù)分析結(jié)果產(chǎn)生負(fù)面影響,因此識(shí)別并處理它們是很重要的。
以下是兩種常用的統(tǒng)計(jì)方法來(lái)檢測(cè)異常值:
Z-score 方法:
Z-score 是一個(gè)測(cè)量值相對(duì)于整個(gè)數(shù)據(jù)集的均值和標(biāo)準(zhǔn)差的距離。對(duì)于給定的數(shù)據(jù)點(diǎn) (x),其 Z-score 可以通過(guò)以下公式計(jì)算:
[ Z = \frac{x - \mu}{\sigma} ]
其中,(\mu) 是數(shù)據(jù)的均值,(\sigma) 是數(shù)據(jù)的標(biāo)準(zhǔn)差。通常,如果某個(gè)數(shù)據(jù)點(diǎn)的 Z-score 的絕對(duì)值大于 3(或根據(jù)具體情境選擇其他閾值,如 2 或 3.5),則可以將該數(shù)據(jù)點(diǎn)視為異常值。
import numpy as np from scipy import stats # 示例數(shù)據(jù) data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 20]) # 最后一個(gè)值是異常值 # 計(jì)算Z-score z_scores = np.abs(stats.zscore(data)) print("z_scores:",z_scores) # [1.07349008 0.87831007 0.68313005 0.48795004 0.29277002 0.09759001 # 0.09759001 0.29277002 0.48795004 2.6349302 ] # 設(shè)定閾值,通常使用2.5作為標(biāo)準(zhǔn),但可以根據(jù)實(shí)際情況調(diào)整 threshold = 2.5 # 檢測(cè)異常值 outliers = np.where(z_scores > threshold) print("異常值的索引:", outliers) # (array([], dtype=int64),) print("異常值:", data[outliers]) # [20]
IQR 法則(四分位距法則):
IQR 是第三四分位數(shù)(Q3)與第一四分位數(shù)(Q1)之差,用于測(cè)量數(shù)據(jù)的離散程度。IQR 法則定義了一個(gè)范圍,該范圍由 Q1 - 1.5 * IQR 和 Q3 + 1.5 * IQR 界定。任何落在這個(gè)范圍之外的數(shù)據(jù)點(diǎn)都可以被視為異常值。具體來(lái)說(shuō),IQR 的計(jì)算公式為:
[ IQR = Q3 - Q1 ]
異常值的檢測(cè)范圍為:
[ \text{下限} = Q1 - 1.5 \times IQR ]
[ \text{上限} = Q3 + 1.5 \times IQR ]
import numpy as np # 示例數(shù)據(jù) data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 50]) # 最后一個(gè)值是異常值 # 計(jì)算四分位數(shù)和IQR Q1 = np.percentile(data, 25) Q3 = np.percentile(data, 75) IQR = Q3 - Q1 # 設(shè)定IQR法則的閾值 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR print(f'lower_bound:{lower_bound}, upper_bound:{upper_bound}') # lower_bound:-3.5, upper_bound:14.5 # 檢測(cè)異常值 outliers = np.where((data < lower_bound) | (data > upper_bound)) print("異常值的索引:", outliers) # (array([9], dtype=int64),) print("異常值:", data[outliers]) # [50]
使用這兩種方法時(shí),需要注意以下幾點(diǎn):
- 選擇哪種方法取決于數(shù)據(jù)的分布和特性。Z-score 方法假設(shè)數(shù)據(jù)近似正態(tài)分布,而 IQR 法則對(duì)于偏態(tài)分布或非正態(tài)分布的數(shù)據(jù)更為穩(wěn)健。
- 閾值(如 Z-score 的 3 或 IQR 法則的 1.5 倍 IQR)是經(jīng)驗(yàn)性的,可能需要根據(jù)具體情況進(jìn)行調(diào)整。
- 檢測(cè)到的異常值需要進(jìn)一步分析,以確定它們是真正的異常還是數(shù)據(jù)中的有效部分。不是所有超出范圍的數(shù)值都是錯(cuò)誤的,有些可能是合理的極端值。
- 在處理異常值時(shí),應(yīng)謹(jǐn)慎考慮是否刪除或替換它們。有時(shí),異常值可能包含重要信息,不應(yīng)輕易丟棄。
2、去除停用詞、標(biāo)點(diǎn)符號(hào)和特殊字符
在處理文本數(shù)據(jù)時(shí),去除停用詞(如“的”、“是”、“在”等常用詞匯)、標(biāo)點(diǎn)符號(hào)和特殊字符是常見(jiàn)的預(yù)處理步驟。這些元素通常不包含對(duì)文本意義有實(shí)質(zhì)性貢獻(xiàn)的信息,而且可能會(huì)干擾自然語(yǔ)言處理或機(jī)器學(xué)習(xí)模型的性能。
以下是一個(gè)簡(jiǎn)單的Python示例,展示了如何使用nltk
庫(kù)(自然語(yǔ)言處理工具包)去除文本中的停用詞,以及如何使用正則表達(dá)式去除標(biāo)點(diǎn)符號(hào)和特殊字符:
import re import nltk from nltk.corpus import stopwords # 確保已經(jīng)下載了停用詞列表 nltk.download('stopwords') # 獲取停用詞列表 stop_words = set(stopwords.words('chinese')) # 假設(shè)我們處理的是中文文本 # 定義一個(gè)函數(shù)去除停用詞 def remove_stopwords(text, stop_words): return ' '.join([word for word in text.split() if word not in stop_words]) # 定義一個(gè)函數(shù)去除標(biāo)點(diǎn)符號(hào)和特殊字符 def remove_punctuation_and_special_chars(text): # 使用正則表達(dá)式替換非字母數(shù)字的字符 return re.sub(r'[^\w\s]', '', text) # 示例文本 text = "這是。一個(gè)示例,文本!里面包含了許多停用詞、標(biāo)點(diǎn)符號(hào)和特殊字符。" # 去除標(biāo)點(diǎn)符號(hào)和特殊字符 cleaned_text = remove_punctuation_and_special_chars(text) # 去除停用詞 cleaned_text = remove_stopwords(cleaned_text, stop_words) print(cleaned_text)
請(qǐng)注意,nltk.corpus.stopwords.words('chinese')
提供的是英文停用詞列表。對(duì)于中文,你可能需要自己創(chuàng)建一個(gè)中文停用詞列表或使用現(xiàn)有的中文NLP庫(kù)(如jieba)來(lái)提供中文停用詞。
此外,remove_punctuation_and_special_chars
函數(shù)使用正則表達(dá)式 [^\w\s]
來(lái)匹配任何非字母數(shù)字和非空白的字符,并將其替換為空字符串。這可以有效地去除標(biāo)點(diǎn)符號(hào)和特殊字符。
如果你處理的是中文文本,正則表達(dá)式可能需要根據(jù)中文字符的特點(diǎn)進(jìn)行調(diào)整。例如,如果你想去除所有的中文字符以外的符號(hào),你可以使用 [^\u4e00-\u9fa5]
正則表達(dá)式來(lái)匹配非中文字符。
最后,請(qǐng)注意,停用詞的去除并不總是必要的或有益的,這取決于你的具體任務(wù)和模型。在某些情況下,停用詞可能包含對(duì)模型有用的上下文信息。
3、標(biāo)準(zhǔn)化(Z-score標(biāo)準(zhǔn)化):將數(shù)據(jù)轉(zhuǎn)換為均值為0,標(biāo)準(zhǔn)差為1的分布
標(biāo)準(zhǔn)化(也稱(chēng)為Z-score標(biāo)準(zhǔn)化或Standard Score)是一種常用的數(shù)據(jù)預(yù)處理技術(shù),其目的是將數(shù)據(jù)轉(zhuǎn)換為均值為0,標(biāo)準(zhǔn)差為1的分布。這種方法對(duì)于許多機(jī)器學(xué)習(xí)算法都很重要,因?yàn)樗梢詭椭惴ǜ玫靥幚聿煌叨鹊臄?shù)據(jù),并減少某些特征由于具有較大的數(shù)值范圍而對(duì)結(jié)果產(chǎn)生過(guò)大的影響。
Z-score標(biāo)準(zhǔn)化的公式如下:
[ z = \frac{x - \mu}{\sigma} ]
其中:
- ( z ) 是標(biāo)準(zhǔn)化后的值。
- ( x ) 是原始數(shù)據(jù)中的值。
- ( \mu ) 是原始數(shù)據(jù)的均值。
- ( \sigma ) 是原始數(shù)據(jù)的標(biāo)準(zhǔn)差。
在Python中,你可以使用scipy.stats
庫(kù)中的zscore
函數(shù)來(lái)進(jìn)行Z-score標(biāo)準(zhǔn)化,或者手動(dòng)實(shí)現(xiàn)上述公式。以下是一個(gè)使用Pandas和NumPy進(jìn)行Z-score標(biāo)準(zhǔn)化的示例:
import pandas as pd import numpy as np # 創(chuàng)建一個(gè)簡(jiǎn)單的DataFrame作為示例數(shù)據(jù) data = {'value': [10, 20, 30, 40, 50]} df = pd.DataFrame(data) # 計(jì)算均值和標(biāo)準(zhǔn)差 mean = df['value'].mean() std = df['value'].std() # 應(yīng)用Z-score標(biāo)準(zhǔn)化公式 df['standardized_value'] = (df['value'] - mean) / std print(df) import pandas as pd import numpy as np # 創(chuàng)建一個(gè)簡(jiǎn)單的DataFrame作為示例數(shù)據(jù) data = {'value': [10, 20, 30, 40, 50]} df = pd.DataFrame(data) # 計(jì)算均值和標(biāo)準(zhǔn)差 mean = df['value'].mean() std = df['value'].std() # 應(yīng)用Z-score標(biāo)準(zhǔn)化公式 df['standardized_value'] = (df['value'] - mean) / std print(df)
value standardized_value
0 10 -1.264911
1 20 -0.632456
2 30 0.000000
3 40 0.632456
4 50 1.264911
或者使用scipy.stats
的zscore
函數(shù):
from scipy import stats # 使用scipy的zscore函數(shù)進(jìn)行標(biāo)準(zhǔn)化 df['zscore_value'] = stats.zscore(df['value']) print(df)
value zscore_value
0 10 -1.414214
1 20 -0.707107
2 30 0.000000
3 40 0.707107
4 50 1.414214
兩種方法都會(huì)得到相同的結(jié)果,即將原始數(shù)據(jù)轉(zhuǎn)換為均值為0,標(biāo)準(zhǔn)差為1的分布。標(biāo)準(zhǔn)化后的數(shù)據(jù)可以更好地用于機(jī)器學(xué)習(xí)模型,因?yàn)樗鼈兙哂邢嗤某叨龋@有助于防止某些特征對(duì)模型產(chǎn)生過(guò)大的影響。
4、歸一化(Min-Max歸一化):將數(shù)據(jù)縮放到[0,1]或[-1,1]的范圍內(nèi)
歸一化(Normalization)是另一種常見(jiàn)的數(shù)據(jù)預(yù)處理技術(shù),用于將數(shù)據(jù)縮放到一個(gè)特定的范圍內(nèi),通常是[0,1]或[-1,1]。Min-Max歸一化是一種簡(jiǎn)單的歸一化方法,它通過(guò)線性變換將數(shù)據(jù)值映射到指定的范圍。
Min-Max歸一化到[0,1]范圍
將數(shù)據(jù)歸一化到[0,1]范圍的公式如下:
[ x’ = \frac{x - \text{min}}{\text{max} - \text{min}} ]
其中:
- ( x’ ) 是歸一化后的值。
- ( x ) 是原始數(shù)據(jù)中的值。
- ( \text{min} ) 是原始數(shù)據(jù)中的最小值。
- ( \text{max} ) 是原始數(shù)據(jù)中的最大值。
Min-Max歸一化到[-1,1]范圍
將數(shù)據(jù)歸一化到[-1,1]范圍的公式稍有不同,如下所示:
[ x’ = 2 \times \frac{x - \text{min}}{\text{max} - \text{min}} - 1 ]
或者使用另一個(gè)公式:
[ x’ = \frac{x - (\text{max} + \text{min}) / 2}{(\text{max} - \text{min}) / 2} ]
這兩個(gè)公式都會(huì)將數(shù)據(jù)映射到[-1,1]范圍內(nèi)。
在Python中,你可以使用NumPy庫(kù)來(lái)輕松實(shí)現(xiàn)Min-Max歸一化。以下是一個(gè)示例代碼:
import numpy as np # 假設(shè)這是你的數(shù)據(jù)集 data = np.array([10, 20, 30, 40, 50]) # 計(jì)算最小值和最大值 data_min = np.min(data) data_max = np.max(data) # Min-Max歸一化到[0,1]范圍 normalized_data_01 = (data - data_min) / (data_max - data_min) print("Normalized to [0,1]:", normalized_data_01) # Min-Max歸一化到[-1,1]范圍(使用第一個(gè)公式) normalized_data_11 = 2 * (data - data_min) / (data_max - data_min) - 1 print("Normalized to [-1,1] (formula 1):", normalized_data_11) # 或者使用第二個(gè)公式歸一化到[-1,1]范圍 normalized_data_11_alt = (data - (data_max + data_min) / 2) / ((data_max - data_min) / 2) print("Normalized to [-1,1] (formula 2):", normalized_data_11_alt)
Normalized to [0,1]: [0. 0.25 0.5 0.75 1. ]
Normalized to [-1,1] (formula 1): [-1. -0.5 0. 0.5 1. ]
Normalized to [-1,1] (formula 2): [-1. -0.5 0. 0.5 1. ]
這段代碼首先計(jì)算了數(shù)據(jù)中的最小值和最大值,然后使用這些值來(lái)將數(shù)據(jù)歸一化到[0,1]或[-1,1]的范圍。歸一化后的數(shù)據(jù)在機(jī)器學(xué)習(xí)模型中通常表現(xiàn)更好,因?yàn)樗鼈兌急豢s放到了一個(gè)共同的范圍,這有助于模型訓(xùn)練的穩(wěn)定性和收斂速度。
5、獨(dú)熱編碼(One-Hot Encoding):將分類(lèi)變量轉(zhuǎn)換為二進(jìn)制列。
獨(dú)熱編碼(One-Hot Encoding)是一種將分類(lèi)變量(Categorical Variables)或名義變量(Nominal Variables)轉(zhuǎn)換為機(jī)器學(xué)習(xí)算法易于利用的格式的方法。在數(shù)據(jù)處理和準(zhǔn)備過(guò)程中,經(jīng)常會(huì)遇到一些分類(lèi)特征,例如:顏色(紅、綠、藍(lán))、星期幾(周一到周日)、性別(男、女)等。這些分類(lèi)特征通常不能直接用于機(jī)器學(xué)習(xí)模型,因?yàn)樗鼈儾皇菙?shù)值型的,而大多數(shù)機(jī)器學(xué)習(xí)算法都只能處理數(shù)值型數(shù)據(jù)。
獨(dú)熱編碼的基本思想是為每一個(gè)分類(lèi)值創(chuàng)建一個(gè)新的二進(jìn)制列,如果原始數(shù)據(jù)中的分類(lèi)值等于該列代表的分類(lèi),則該列為1,否則為0。通過(guò)這種方式,每個(gè)分類(lèi)值都被表示為一個(gè)唯一的二進(jìn)制向量,這樣機(jī)器學(xué)習(xí)模型就能夠處理這些分類(lèi)特征了。
例如,假設(shè)有一個(gè)特征叫做“顏色”,它有三個(gè)可能的取值:紅色、綠色和藍(lán)色。通過(guò)獨(dú)熱編碼,我們可以將這個(gè)特征轉(zhuǎn)換為三個(gè)二進(jìn)制列:
- 顏色_紅色:如果原始數(shù)據(jù)中的顏色是紅色,則該列為1,否則為0。
- 顏色_綠色:如果原始數(shù)據(jù)中的顏色是綠色,則該列為1,否則為0。
- 顏色_藍(lán)色:如果原始數(shù)據(jù)中的顏色是藍(lán)色,則該列為1,否則為0。
在Python中,可以使用pandas庫(kù)或者scikit-learn庫(kù)中的OneHotEncoder
類(lèi)來(lái)進(jìn)行獨(dú)熱編碼。以下是一個(gè)使用pandas進(jìn)行獨(dú)熱編碼的示例:
import pandas as pd # 假設(shè)有一個(gè)包含分類(lèi)變量'顏色'的DataFrame df = pd.DataFrame({ '顏色': ['紅色', '綠色', '藍(lán)色', '紅色', '綠色'] }) # 使用pandas的get_dummies方法進(jìn)行獨(dú)熱編碼 df_onehot = pd.get_dummies(df, columns=['顏色']) print(df_onehot)
輸出將會(huì)是類(lèi)似這樣的DataFrame:
顏色_紅色 顏色_綠色 顏色_藍(lán)色
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
4 0 1 0
在這個(gè)例子中,顏色
這一列被轉(zhuǎn)換成了三個(gè)新的列:顏色_紅色
、顏色_綠色
和顏色_藍(lán)色
,分別對(duì)應(yīng)顏色的三個(gè)分類(lèi)值。每一行中,只有一個(gè)列的值為1,其余為0,表示原始數(shù)據(jù)中對(duì)應(yīng)的顏色分類(lèi)。
6、標(biāo)簽編碼(Label Encoding):將分類(lèi)變量轉(zhuǎn)換為整數(shù)
標(biāo)簽編碼(Label Encoding)是一種簡(jiǎn)單的方法,用于將分類(lèi)變量(也稱(chēng)為名義變量或類(lèi)別變量)轉(zhuǎn)換為整數(shù)。這種方法通常用于將無(wú)序的分類(lèi)標(biāo)簽(如顏色、星期幾的名稱(chēng)、性別的文字表示等)轉(zhuǎn)換為機(jī)器學(xué)習(xí)模型可以處理的數(shù)值格式。
在標(biāo)簽編碼中,每個(gè)唯一的分類(lèi)標(biāo)簽都會(huì)被分配一個(gè)唯一的整數(shù)。例如,如果有三個(gè)分類(lèi)標(biāo)簽“紅”、“綠”和“藍(lán)”,標(biāo)簽編碼可能會(huì)將它們分別轉(zhuǎn)換為整數(shù)0、1和2(或者任何其他的整數(shù)映射,關(guān)鍵是保持映射的一致性)。
雖然標(biāo)簽編碼可以將分類(lèi)變量轉(zhuǎn)換為數(shù)值,但它有一個(gè)重要的限制:它假設(shè)了類(lèi)別之間有一種順序關(guān)系,這在許多情況下是不正確的。例如,在顏色“紅”、“綠”和“藍(lán)”之間并沒(méi)有自然的順序,但如果使用標(biāo)簽編碼,模型可能會(huì)錯(cuò)誤地解釋這些編碼后的整數(shù)之間存在某種順序或等級(jí)關(guān)系。
因此,在使用標(biāo)簽編碼時(shí)需要特別小心,確保轉(zhuǎn)換后的整數(shù)不會(huì)被模型誤解為具有順序性。如果分類(lèi)變量是有序的(比如評(píng)分等級(jí)“低”、“中”、“高”),那么標(biāo)簽編碼是合適的。
在Python中,可以使用sklearn.preprocessing
中的LabelEncoder
類(lèi)來(lái)進(jìn)行標(biāo)簽編碼。以下是一個(gè)示例:
from sklearn.preprocessing import LabelEncoder # 創(chuàng)建標(biāo)簽編碼器 le = LabelEncoder() # 假設(shè)有一個(gè)分類(lèi)變量列表 categories = ['red', 'green', 'blue', 'red', 'green'] # 對(duì)分類(lèi)變量進(jìn)行標(biāo)簽編碼 encoded_categories = le.fit_transform(categories) print(encoded_categories) # 輸出可能是 [2 1 0 2 1],具體整數(shù)取決于編碼器內(nèi)部的映射 # 可以通過(guò)classes_屬性查看標(biāo)簽到整數(shù)的映射 print(le.classes_) # 輸出 ['blue', 'green', 'red'] 或者其他順序,這取決于數(shù)據(jù)中出現(xiàn)的順序
請(qǐng)注意,標(biāo)簽編碼的結(jié)果依賴(lài)于標(biāo)簽在數(shù)據(jù)中出現(xiàn)的順序,因此不同的數(shù)據(jù)集或不同的標(biāo)簽順序可能會(huì)導(dǎo)致不同的編碼結(jié)果。此外,如果測(cè)試數(shù)據(jù)集中出現(xiàn)了訓(xùn)練數(shù)據(jù)集中未出現(xiàn)的類(lèi)別,標(biāo)簽編碼器將無(wú)法正確處理這些新類(lèi)別,除非對(duì)其進(jìn)行適當(dāng)?shù)奶幚恚ㄈ缡褂胔andle_unknown='ignore'參數(shù)或預(yù)先定義所有可能的類(lèi)別)。
對(duì)于無(wú)序的分類(lèi)變量,通常推薦使用獨(dú)熱編碼(One-Hot Encoding)而不是標(biāo)簽編碼,以避免引入不必要的順序關(guān)系。
7、順序編碼(Ordinal Encoding):針對(duì)有序的分類(lèi)變量,將其轉(zhuǎn)換為整數(shù),保留順序信息
順序編碼(Ordinal Encoding)是一種特定于有序分類(lèi)變量的編碼方法。與標(biāo)簽編碼(Label Encoding)類(lèi)似,順序編碼也是將分類(lèi)標(biāo)簽轉(zhuǎn)換為整數(shù)。然而,與標(biāo)簽編碼不同的是,順序編碼專(zhuān)門(mén)用于那些具有自然順序的分類(lèi)變量,因此轉(zhuǎn)換后的整數(shù)不僅代表了不同的類(lèi)別,還保留了類(lèi)別之間的順序關(guān)系。
例如,假設(shè)我們有一個(gè)表示用戶(hù)滿(mǎn)意度的有序分類(lèi)變量,其類(lèi)別為“非常不滿(mǎn)意”、“不滿(mǎn)意”、“一般”、“滿(mǎn)意”和“非常滿(mǎn)意”。這些類(lèi)別之間存在一個(gè)明確的順序關(guān)系,即“非常不滿(mǎn)意” < “不滿(mǎn)意” < “一般” < “滿(mǎn)意” < “非常滿(mǎn)意”。在順序編碼中,我們可以將這些類(lèi)別按順序映射為整數(shù),比如映射為0、1、2、3和4。
在Python中,順序編碼可以通過(guò)自定義映射或使用現(xiàn)有的數(shù)據(jù)預(yù)處理庫(kù)來(lái)實(shí)現(xiàn)。以下是一個(gè)簡(jiǎn)單的Python示例,展示如何手動(dòng)進(jìn)行順序編碼:
# 有序分類(lèi)變量的類(lèi)別 satisfaction_levels = ["非常不滿(mǎn)意", "不滿(mǎn)意", "一般", "滿(mǎn)意", "非常滿(mǎn)意"] # 自定義順序編碼映射 ordinal_mapping = {level: index for index, level in enumerate(satisfaction_levels)} print(ordinal_mapping) # 輸出:{'非常不滿(mǎn)意': 0, '不滿(mǎn)意': 1, '一般': 2, '滿(mǎn)意': 3, '非常滿(mǎn)意': 4} # 示例數(shù)據(jù) data = ["非常不滿(mǎn)意", "滿(mǎn)意", "一般", "非常滿(mǎn)意", "不滿(mǎn)意"] # 進(jìn)行順序編碼 encoded_data = [ordinal_mapping[level] for level in data] print(encoded_data) # 輸出: [0, 3, 2, 4, 1]
在這個(gè)例子中,我們創(chuàng)建了一個(gè)從滿(mǎn)意度級(jí)別到整數(shù)的映射,并使用這個(gè)映射來(lái)轉(zhuǎn)換示例數(shù)據(jù)。轉(zhuǎn)換后的整數(shù)列表encoded_data
保留了原始滿(mǎn)意度級(jí)別的順序信息。
當(dāng)使用機(jī)器學(xué)習(xí)模型時(shí),如果分類(lèi)變量是有序的,并且順序信息對(duì)模型預(yù)測(cè)很重要,那么使用順序編碼是很有意義的。然而,需要注意的是,如果模型不能很好地處理這種順序關(guān)系(比如某些基于距離的算法),則可能需要考慮其他編碼方法,如獨(dú)熱編碼。
內(nèi)置方式
在Python的機(jī)器學(xué)習(xí)庫(kù)中,并沒(méi)有直接命名為“順序編碼”的內(nèi)置功能,因?yàn)轫樞蚓幋a通常是通過(guò)簡(jiǎn)單的映射實(shí)現(xiàn)的,不需要復(fù)雜的庫(kù)函數(shù)。然而,你可以利用sklearn.preprocessing
中的LabelEncoder
來(lái)實(shí)現(xiàn)順序編碼,只要確保你的分類(lèi)變量是有序的,并且你按照正確的順序?qū)λ鼈冞M(jìn)行編碼。
LabelEncoder
會(huì)將每個(gè)唯一的標(biāo)簽分配一個(gè)整數(shù),通常是根據(jù)標(biāo)簽在數(shù)據(jù)中出現(xiàn)的順序。如果你的有序分類(lèi)變量的順序與它們?cè)跀?shù)據(jù)中出現(xiàn)的順序一致,你可以直接使用LabelEncoder
。否則,你可能需要先對(duì)分類(lèi)變量進(jìn)行排序,然后再使用LabelEncoder
,或者手動(dòng)創(chuàng)建一個(gè)映射字典來(lái)實(shí)現(xiàn)順序編碼。
下面是一個(gè)使用LabelEncoder
進(jìn)行順序編碼的示例:
from sklearn.preprocessing import LabelEncoder import numpy as np # 有序分類(lèi)變量的類(lèi)別,按順序排列 categories = np.array(["低", "中", "高"]) # 創(chuàng)建標(biāo)簽編碼器 le = LabelEncoder() # 對(duì)有序分類(lèi)變量進(jìn)行編碼 encoded_categories = le.fit_transform(categories) print(encoded_categories) # 輸出: [0 1 2] # 對(duì)于新的數(shù)據(jù)點(diǎn),也可以使用相同的編碼器進(jìn)行轉(zhuǎn)換 new_data = np.array(["中", "高", "低"]) encoded_new_data = le.transform(new_data) print(encoded_new_data) # 輸出: [1 2 0]
在這個(gè)例子中,我們首先創(chuàng)建了一個(gè)有序的類(lèi)別數(shù)組,然后使用LabelEncoder對(duì)其進(jìn)行編碼。由于類(lèi)別已經(jīng)是有序的,并且是按照我們想要的順序出現(xiàn)的,所以編碼后的整數(shù)保留了原有的順序信息。
如果你使用的有序分類(lèi)變量的順序與它們?cè)跀?shù)據(jù)集中出現(xiàn)的順序不一致,你需要先對(duì)它們進(jìn)行排序,或者手動(dòng)指定一個(gè)映射關(guān)系來(lái)確保正確的順序編碼。
請(qǐng)注意,雖然LabelEncoder通常用于標(biāo)簽編碼,但只要確保類(lèi)別的有序性,它同樣可以用于實(shí)現(xiàn)順序編碼。如果你正在使用的庫(kù)或框架有特定的順序編碼功能,請(qǐng)查閱相關(guān)文檔以獲取詳細(xì)信息。不同的庫(kù)和框架可能有不同的實(shí)現(xiàn)方式和命名約定。
以上就是Python scikit-learn數(shù)據(jù)預(yù)處理常見(jiàn)方法和步驟的詳細(xì)內(nèi)容,更多關(guān)于Python數(shù)據(jù)預(yù)處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3使用urllib模塊制作網(wǎng)絡(luò)爬蟲(chóng)
本文給大家介紹的是利用urllib模塊通過(guò)指定的URL抓取網(wǎng)頁(yè)內(nèi)容 所謂網(wǎng)頁(yè)抓取,就是把URL地址中指定的網(wǎng)絡(luò)資源從網(wǎng)絡(luò)流中讀取出來(lái),保存到本地,有需要的小伙伴可以參考下2016-04-04Python基礎(chǔ)實(shí)戰(zhàn)總結(jié)
今天要給大家介紹的是Python基礎(chǔ)實(shí)戰(zhàn),本文主要以舉例說(shuō)明講解:?jiǎn)栴}的關(guān)鍵點(diǎn)就是在于構(gòu)造姓名,學(xué)號(hào)和成績(jī),之后以字典的形式進(jìn)行寫(xiě)入文件。這里準(zhǔn)備兩個(gè)列表,一個(gè)姓,一個(gè)名,之后使用random庫(kù)進(jìn)行隨機(jī)字符串拼接,得到姓名,需要的朋友可以參考一下2021-10-10VSCode搭建Django開(kāi)發(fā)環(huán)境的圖文步驟
本篇介紹在vscode環(huán)境下搭建Django開(kāi)發(fā)環(huán)境的詳細(xì)步驟,包括Python、Django、VSCode等,以及它們的安裝和配置方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09在python image 中安裝中文字體的實(shí)現(xiàn)方法
今天小編大家分享一篇在python image 中安裝中文字體的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python搭建自己IP代理池的方法實(shí)現(xiàn)
本文主要介紹了Python搭建自己IP代理池的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02python 制作自定義包并安裝到系統(tǒng)目錄的方法
今天小編就為大家分享一篇python 制作自定義包并安裝到系統(tǒng)目錄的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Python3 pyecharts生成Html文件柱狀圖及折線圖代碼實(shí)例
這篇文章主要介紹了Python3 pyecharts生成Html文件柱狀圖及折線圖代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09