當我們團隊的項目在今年的CALL共享任務挑戰的文本子任務中首先得分時,我們成功的關鍵組成部分之一是仔細準備和清理數據。數據清理和準備是任何AI項目中最關鍵的第一步。正如證據所示,大多數數據科學家將大部分時間(高達70%)用於清理數據。
在這篇博文中,我們將引導您完成Python中數據清理和預處理的這些初始步驟,從將最流行的庫導入到功能的實際編碼開始。
數據清理或數據清理是從記錄集,表或數據庫中檢測和糾正(或刪除)損壞或不準確的記錄的過程,指的是識別數據的不完整,不正確,不準確或不相關的部分,然後替換,修改,或刪除臟數據或粗數據。// 維基百科
步驟1.加載數據集
導入庫
您需要做的首要事情是導入數據庫預處理庫。有許多庫可用,但用於處理數據的最流行和最重要的Python庫是Numpy,Matplotlib和Pandas。Numpy是用於所有數學事物的庫。Pandas是可用於導入和管理數據集的最佳工具。Matplotlib(Matplotlib.pyplot)是製作圖表的庫。
為了便於將來使用,您可以使用快捷方式別名導入這些庫:
import numpy as np import matplotlib.pyplot as plt import pandas as pd
將數據加載到pandas中
下載數據集並將其命名為.csv文件後,需要將其加載到pandas DataFrame中進行探索並執行一些基本的清理任務,刪除不需要的信息,這樣可以減慢數據處理速度。
通常,此類任務包括:
- 刪除第一行:它包含無關文本而不是列標題。此文本可防止pandas庫正確解析數據集:
my_dataset = pd.read_csv('data / my_dataset.csv',skiprows = 1,low_memory = False)
- 刪除包含我們不需要的文本說明的列,url列和其他不必要的列:
my_dataset = my_dataset.drop(['url'],axis = 1)
- 刪除僅包含一個值的所有列,或者具有超過50%的缺失值以更快地工作(如果您的數據集足夠大以至於仍然有意義):
my_dataset = my_dataset.dropna(thresh = half_count,axis = 1)
以不同方式命名過濾數據集以使其與原始數據分離也是一種很好的做法。這樣可以確保您仍然擁有原始數據,以備需要返回時使用。
步驟2.探索數據集
了解數據
現在您已經設置了數據,但是您仍然應該花一些時間來探索它並了解每個列所代表的功能。對數據集的這種人工審查很重要,以避免數據分析和建模過程中的錯誤。
為了簡化過程,您可以使用數據字典中的列,數據類型,第一行值和描述的名稱創建DataFrame。
在探索這些功能時,您可以關注以下任何列:
- 格式不佳,
- 需要更多數據或大量預處理才能變成有用的功能,或者
- 包含冗餘信息,
因為如果處理不當,這些事情會損害您的分析。
您還應該注意數據泄漏,這可能導致模型過度擬合。這是因為該模型還將學習在我們使用它進行預測時無法使用的功能。我們需要確保我們的模型僅使用貸款申請時的數據進行培訓。
確定目標列
通過探索過濾數據集,您需要創建因變量矩陣和自變量向量。首先,您應根據要回答的問題確定要用作建模目標列的相應列。例如,如果您想預測癌症的發展,或者信用證被批准的機會,您需要找到一個列有疾病狀態的列或貸款授予廣告使用它作為目標列。
例如,如果目標列是最後一列,則可以通過鍵入以下內容來創建因變量矩陣:
X = dataset.iloc [:,: - 1] .values
這第一個冒號(:)意味着我們想在我們的數據集中的所有線路。:-1表示我們想要獲取除最後一列之外的所有數據列。在上月底表示,我們希望所有的值。.values
要獲得僅包含最後一列數據的自變量向量,可以鍵入
y = dataset.iloc [:, - 1] .values
步驟3.準備機器學習功能
最後,是時候做準備工作來提供ML算法的功能。要清理數據集,您需要處理缺失值和分類特徵,因為大多數機器學習模型的數學假設數據是數字的並且不包含缺失值。此外,如果您嘗試使用包含缺失值或非數字值的數據訓練線性回歸和邏輯回歸等模型,則scikit-learn庫會返回錯誤。
處理缺失值
丟失的數據可能是不潔凈數據的最常見特徵。這些值通常採用NaN或None的形式。
這裡有幾個缺失值的原因:有時缺少值,因為它們不存在,或者由於數據收集不當或數據輸入不當。例如,如果某人未成年,並且該問題適用於18歲以上的人,則該問題將包含缺失值。在這種情況下,填寫該問題的值是錯誤的。
有幾種方法可以填充缺失的值:
- 如果您的數據集足夠大並且缺失值的百分比很高(例如,超過50%),則可以刪除包含數據的行;
- 你可以用0填充所有空變量來處理數值;
- 你可以使用scikit-learn庫中的Imputer類用數據填充缺失值(mean,median,most_frequent)
- 您還可以決定使用同一列中的任何值直接填充缺失值。
這些決策取決於數據類型,您要對數據執行的操作以及缺少值的原因。實際上,僅僅因為某些東西很受歡迎並不一定使它成為正確的選擇。最常見的策略是使用平均值,但根據您的數據,您可能會採用完全不同的方法。
處理分類數據
機器學習僅使用數值(float或int數據類型)。但是,數據集通常包含要轉換為數字的對象數據類型。在大多數情況下,分類值是離散的,可以編碼為虛擬變量,為每個類別分配一個數字。最簡單的方法是使用One Hot Encoder,指定要處理的列的索引:
來自sklearn.preprocessing import OneHotEncoder onehotencoder = OneHotEncoder(categorical_features = [0])X = onehotencoder.fit_transform(X).toarray()
處理不一致的數據輸入
例如,當列中存在不同的唯一值時,就會出現不一致的情況。您可以考慮使用不同的大寫方法,簡單的錯誤印記和不一致的格式來形成一個想法。刪除數據不一致的方法之一是刪除條目名稱之前或之後的空格,並將所有情況轉換為小寫。
但是,如果存在大量不一致的唯一條目,則無法手動檢查最接近的匹配項。您可以使用Fuzzy Wuzzy包來識別哪些字符串最可能是相同的。它接受兩個字符串並返回一個比率。比率越接近100,你就越有可能統一字符串。
處理日期和時間
特定類型的數據不一致是日期格式不一致,例如相同列中的dd / mm / yy和mm / dd / yy。您的日期值可能不是正確的數據類型,這將不允許您有效地執行操作並從中獲取洞察力。這次您可以使用datetime包來修復日期的類型。
縮放和規範化
如果您需要指定一個數量的變化不等於另一個數量的另一個變化,則縮放很重要。藉助縮放,您可以確保僅僅因為某些功能很大,它們不會被用作主要預測器。例如,如果你在預測中使用一個人的年齡和工資,一些算法會更加關注薪水,因為它更大,這沒有任何意義。
規範化涉及將數據集轉換或轉換為正態分布。像SVM這樣的算法在標準化數據上的收斂速度要快得多,因此將數據標準化以獲得更好的結果是有意義的。
有許多方法可以執行特徵縮放。簡而言之,我們將所有功能放在相同的比例中,以便沒有一個功能被另一個功能所支配。例如,您可以使用sklearn.preprocessing包中的StandardScaler類來擬合和轉換數據集:
來自sklearn.preprocessing import StandardScaler sc_X = StandardScaler()X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)由於您不需要將其放入測試集,您只需應用轉換即可。sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train)
保存為CSV
為了確保您仍然擁有原始數據,最好將工作流的每個部分或階段的最終輸出存儲在單獨的csv文件中。這樣,您就可以在數據處理流程中進行更改,而無需重新計算所有內容。
正如我們之前所做的那樣,您可以使用pandas to_csv()
函數將DataFrame存儲為.csv 。
my_dataset.to_csv(“processed_data/cleaned_dataset.csv”,index=False)
結論
這些是處理大型數據集,清理和準備任何Data Science項目數據所需的基本步驟。您可能會發現其他形式的數據清理有用。但是現在我們希望您了解在制定任何模型之前需要妥善安排和整理數據。更好,更清潔的數據優於最佳算法。如果您對最乾淨的數據使用非常簡單的算法,您將獲得非常令人印象深刻的結果。而且,執行基本的預處理並不困難!
本文轉載自medium,原文地址
Comments