數據分析實戰(八):pandas文本數據實戰

問題描述

在許多實際的數據處理工作中,數據集通常包含分類變量。這些變量通常存儲爲表示各種特徵的文本值。一些示例包括顏色(“紅色”,“黃色”,“藍色”),尺寸(“小”,“中”,“大”)或地理名稱(州或國家)。許多機器學習算法可以支持分類值而無需進一步操作,但還有許多算法不支持。因此,分析師面臨的挑戰是如何將這些文本屬性轉換爲數值以便進一步處理。

幸運的是,pandas和scikit-learn的python工具提供了幾種方法,可用於將分類數據轉換爲合適的數值。本文將對一些常見的(以及一些更復雜的)方法進行彙總,希望它能幫助其他人將這些技術應用於他們的現實世界問題。

數據集

在本文中,我在UCI機器學習庫中找到一個好的數據集。這個特定的汽車數據集包括分類值和連續值的組合,並且作爲相對容易理解的有用示例。

import pandas as pd
import numpy as np

# 定義數據的列名稱, 因爲這個數據集沒有包含列名稱
headers = ["symboling", "normalized_losses", "make", "fuel_type", "aspiration",
           "num_doors", "body_style", "drive_wheels", "engine_location",
           "wheel_base", "length", "width", "height", "curb_weight",
           "engine_type", "num_cylinders", "engine_size", "fuel_system",
           "bore", "stroke", "compression_ratio", "horsepower", "peak_rpm",
           "city_mpg", "highway_mpg", "price"]

# 讀取在線的數據集, 並將?轉換爲缺失NaN
df = pd.read_csv("http://mlr.cs.umass.edu/ml/machine-learning-databases/autos/imports-85.data",
                  header=None, names=headers, na_values="?")

data = df.head()[df.columns[:10]]
print(data)

在這裏插入圖片描述
看一下所有列的數據類型
因爲我們只關心文本數據, 所以我們選出類型爲”object”的列, 而pandas提供了select_dtypes方法可以快速達到目的
因爲數據集種包括缺失數據, 這會增加後續處理的難度, 我們爲了簡單起見, 將缺失值刪除即可

print(df.dtypes)
df2 = df.select_dtypes('object').copy()
print(df2.head())

df2.dropna(inplace=True)

在這裏插入圖片描述
在這裏插入圖片描述

方案一:替換字符串

最簡單的方式就是, 查找列中所有的字符串, 然後給不同的字符串一個編號, 然後用編號替換字符串。
使用vlaue_counts獲取所有的字符串:

# 我們以該列爲例:
col = 'body_style'
strs = df2[col].value_counts()
print(strs)

print('\n')
value_map = dict((v, i) for i, v in enumerate(strs.index))
print(value_map)

print('\n')
df2.replace({col: value_map})
print(df2[col].head())

在這裏插入圖片描述

方案二:標籤編碼

在這裏插入圖片描述

# 我們以該列爲例:
bs = df2['body_style'].astype('category')
print(bs.head())


# 然後你只需要使用標籤的編碼作爲真正的數據就可以了:
print(bs.cat.codes.head())

在這裏插入圖片描述

方案三: 轉換成啞變量, 或者叫one-hot編碼

標籤編碼的優點是它很簡單,但它的缺點是數值可能被算法“誤解”。
例如,0的值顯然小於4的值,但這是否真的與現實生活中的數據集相對應?在我們的計算中,旅行車的重量是否比敞篷車重4倍?在這個例子中,我不這麼認爲。所以我們需要將數據轉換爲啞變量(onehot), 在pandas中, 這個轉變只需要一行代碼:

data = pd.get_dummies(df['body_style']).head()
print(data)

在這裏插入圖片描述

方案四: 自定義二分類

根據數據集,您可以使用標籤編碼和one-hot來創建滿足進一步分析需求的二分類列

在此特定數據集中,有一個名爲engine_type的列包含幾個不同的值:

ret1 = df2['engine_type'].value_counts()
print(ret1)

# 爲了便於討論,我們可能關心的是發動機是否是頂置凸輪(OHC)。
# 換句話說,OHC的各種版本對於該分析都是相同的。
# 如果是這種情況,那麼我們可以使用str accessor創建一個新列,指示汽車是否有OHC引擎。

ret2 = df2["engine_type"].str.contains("ohc").map(int).value_counts()
print(ret2)

在這裏插入圖片描述

Scikit-Learn方法

除了pandas方法,scikit-learn還提供類似的功能。就個人而言,我發現使用pandas有點簡單,但我認爲重要的是要知道如何在scikit-learn中執行這些過程。

例如,如果我們想對汽車的品牌進行標籤編碼,我們需要實例化LabelEncoder對象並fit_transform數據:

# 本質就是one-hot編碼
from sklearn.preprocessing import LabelBinarizer

lb_style = LabelBinarizer()
lb_results = lb_style.fit_transform(df2["body_style"])
ret3 = pd.DataFrame(lb_results, columns=lb_style.classes_).head()
print(ret3)

在這裏插入圖片描述

發佈了120 篇原創文章 · 獲贊 9 · 訪問量 4215
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章