目錄
1.什么是離散化?
2.離散化類型
3.示例代碼
3.1連續變量離散化
3.2定性變量離散化
4.運行結果
4.1連續變量離散化
4.2定性變量離散化
1.什么是離散化?
????????離散化是將連續數據或分類數據轉換為離散類別的過程,方便后續的數據分析和機器學習建模。
2.離散化類型
- 連續變量離散化:
- 定義:將連續的數值數據(例如年齡、收入、溫度等)轉換為離散的區間或類別。
- 方法:使用區間劃分,將連續的數據分割成幾個區間,并賦予每個區間一個標簽或編碼。
- 示例:將年齡數據分為“年輕”(18-29歲)、“中年”(30-40歲)、“老年”(41-50歲)。
- 定性變量離散化(分類編碼):
- 定義:將定性(分類)變量(例如性別、顏色、品牌等)轉換為數值型或二進制型變量。
- 方法:將每個類別轉換為一個唯一的數值標簽(數值編碼)或多個二進制變量(獨熱編碼)。
- 示例:將水果名稱轉換為數值編碼(
apple
= 0,banana
= 1,cherry
= 2)或獨熱編碼(apple
= [1, 0, 0],banana
= [0, 1, 0],cherry
= [0, 0, 1])。
3.示例代碼
3.1連續變量離散化
????????等寬分箱(Equal-width binning)是一種將連續變量離散化的方法。它將數據范圍分成寬度相等的區間(也稱為“箱”)。每個區間包含的數據點數量可能不同,但每個區間的寬度是相同的。
將年齡數據劃分為幾個年齡段:
import pandas as pd# 創建 DataFrame
data = {'age': [22, 25, 47, 35, 46, 50, 18, 21, 30, 19]}
df = pd.DataFrame(data)
print("原始數據:")
print(df)# 等寬分箱
df['age_bins'] = pd.cut(df['age'], bins=3, labels=["Young", "Middle-aged", "Old"])
print("\n離散化結果(等寬分箱):")
print(df)
"""pd.cut:Pandas 的 cut 函數用于將連續變量(數值數據)分割成離散的區間。這個函數可以創建等寬區間或自定義區間。df['age']:選擇 DataFrame 中的 age 列作為需要離散化的數據。bins=3:將 age 列的數據分成三個等寬的區間。labels=["Young", "Middle-aged", "Old"]:為每個區間分配標簽。三個區間將分別被標記為“Young”(年輕),“Middle-aged”(中年)和“Old”(老年)。
"""
3.2定性變量離散化
????????獨熱編碼(One-Hot Encoding)是一種將分類變量(定性變量)轉換為二進制向量的編碼方法。每個分類變量的值將被轉換為一個二進制向量,該向量在某個位置上為1,其余位置為0。這樣可以避免分類變量在數值運算中引入大小關系。
定性變量(qualitative variable)又名分類變量,是統計學中的概念。當觀測的個體只能歸屬于幾種互不相容的類別中的一種時,一般用非數字來表達其類別,這樣的觀測數據稱為定性變量。
將水果名稱轉換為數值編碼和獨熱編碼:
import pandas as pd# 創建 DataFrame
data = {'fruit': ['apple', 'banana', 'cherry', 'date', 'apple', 'banana', 'cherry']}
df = pd.DataFrame(data)
print("原始數據:")
print(df)# 數值編碼
df['fruit_code'] = df['fruit'].astype('category').cat.codes
print("\n數值編碼結果:")
print(df)
"""在這里,fruit_code 列中的數據代表 fruit 列中水果名稱的數值編碼。具體解釋如下:apple 被編碼為 0banana 被編碼為 1cherry 被編碼為 2date 被編碼為 3df['fruit']:選擇 DataFrame 中的 fruit 列。astype('category'):將 fruit 列的數據類型轉換為 Pandas 的分類數據類型(category)。分類數據類型是 Pandas 用于處理有限的離散值的一種類型,通常用于表示字符串分類變量。cat.codes:獲取分類數據的編碼。每個唯一的分類值(例如 'apple', 'banana', 'cherry' 等)都會被映射為一個唯一的整數代碼。這些整數代碼存儲在 cat.codes 屬性中。
"""# 獨熱編碼
df_dummies = pd.get_dummies(df['fruit'], prefix='fruit')
print("\n獨熱編碼結果:")
print(df_dummies)
"""pd.get_dummies:Pandas 的 get_dummies 函數用于執行獨熱編碼(One-Hot Encoding)。獨熱編碼是將分類變量轉換為多個二進制(0 或 1)變量的過程。df['fruit']:選擇 DataFrame 中的 fruit 列。prefix='fruit':為生成的虛擬變量添加前綴。在生成的虛擬變量的列名中會添加這個前綴,以便識別這些列屬于哪個原始變量。
"""# 合并結果
df = pd.concat([df, df_dummies], axis=1)
print("\n合并后的結果:")
print(df)
"""pd.concat:Pandas 的 concat 函數用于連接兩個或多個 DataFrame。[df, df_dummies]:將原始 DataFrame df 和獨熱編碼后的 DataFrame df_dummies 作為列表傳遞給 concat 函數。這里我們將這兩個 DataFrame 水平地連接在一起(即按列連接)。axis=1:指定連接操作沿著列軸(軸=1)進行。這意味著新 DataFrame 的列數會增加,而行數保持不變。
"""
4.運行結果
4.1連續變量離散化
原始數據:age
0 22
1 25
2 47
3 35
4 46
5 50
6 18
7 21
8 30
9 19離散化結果(等寬分箱):age age_bins
0 22 Young
1 25 Young
2 47 Old
3 35 Middle-aged
4 46 Old
5 50 Old
6 18 Young
7 21 Young
8 30 Middle-aged
9 19 Young
4.2定性變量離散化
原始數據:fruit
0 apple
1 banana
2 cherry
3 date
4 apple
5 banana
6 cherry數值編碼結果:fruit fruit_code
0 apple 0
1 banana 1
2 cherry 2
3 date 3
4 apple 0
5 banana 1
6 cherry 2獨熱編碼結果:fruit_apple fruit_banana fruit_cherry fruit_date
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
4 1 0 0 0
5 0 1 0 0
6 0 0 1 0合并后的結果:fruit fruit_code fruit_apple fruit_banana fruit_cherry fruit_date
0 apple 0 1 0 0 0
1 banana 1 0 1 0 0
2 cherry 2 0 0 1 0
3 date 3 0 0 0 1
4 apple 0 1 0 0 0
5 banana 1 0 1 0 0
6 cherry 2 0 0 1 0