機器學習模型的效能取決於資料集的品質,因此資料集的迭代最佳化和品品檢驗至關重要。不同於研究環境中使用固定資料集,業界的資料集需要不斷迭代更新以提升模型效能。從簡單資料集開始,逐步擴充套件並根據模型表現調整資料集,是建立高效機器學習產品的關鍵。資料探索的目標不僅是發現趨勢,更要將這些趨勢轉化為產品功能,並考量訓練資料和實際應用資料的差異。資料品質評估框架涵蓋資料格式、完整性、一致性、準確性等導向,並需檢查缺失值和特徵分佈。
資料集的重要性與迭代最佳化
在機器學習(ML)專案中,資料集的品質直接影響模型的表現。與傳統軟體開發不同,ML專案中的資料集不僅是輸入資料,更是產品的一部分,需要不斷迭代和最佳化。
資料集迭代的重要性
- 快速迭代:建立ML產品的關鍵在於快速建立、評估和迭代模型。資料集作為模型成功的核心部分,其收集、準備和標註應視為與建模同等重要的迭代過程。
- 從簡單資料集開始:初始階段應從容易取得的簡單資料集開始,並根據學習結果持續改進。
- 與研究方法的差異:在ML研究中,標準資料集通常是固定的,用作基準測試。然而,在產業應用中,資料集是產品的一部分,需要定期更新和擴充。
資料科學的核心
- 資料策展的挑戰:許多從業者將資料策展視為建立ML產品的主要障礙,部分原因是相關教育資源匱乏,大多數線上課程直接提供資料集並專注於模型訓練。
- 資料品質至關重要:模型的作用是從現有資料中提取趨勢和模式。因此,確保所使用的資料包含足夠的預測性模式,並檢查是否存在明顯的偏差,是資料科學家工作的基礎。
圖表說明:研究與產業的差異
此圖示展示了研究與產業在資料集處理上的差異。在研究領域,資料集通常是固定不變的;而在產業應用中,資料集則是產品的一部分,需要不斷迭代和改進。
圖表翻譯: 此圖比較了研究環境和產業環境中對資料集的不同處理方式。在研究環境中,資料集是固定的,而在產業環境中,資料集則被視為可迭代改進的產品組成部分。
下一步:取得初始資料集
在接下來的章節中,我們將探討如何收集初始資料集、評估其品質,並迭代標註子集,以指導特徵生成和建模決策。這將有助於進一步提升ML產品的效能和使用者經驗。
取得初始資料集的步驟
- 發現資料集:首先,我們需要尋找合適的初始資料集。這涉及評估現有資源,並選擇最符合專案需求的資料。
- 評估資料品質:一旦取得了初始資料集,就需要評估其品質。這包括檢查資料的完整性、一致性和準確性。
- 向量化資料:為了更有效地處理和分析資料,我們需要將其向量化。這使得我們能夠使用各種機器學習演算法來處理資料。
- 標註和檢查資料:向量化後,我們需要標註資料並進行檢查,以確保其品質符合專案需求。
- 指導特徵生成策略:透過檢查和標註資料,我們可以獲得對資料的深入理解,從而指導特徵生成的策略。
透過這些步驟,我們可以建立一個高品質的初始資料集,為後續的建模和最佳化工作奠定堅實的基礎。
探索與驗證資料集:開發強健的機器學習基礎
在機器學習(ML)專案中,資料集的品質直接影響模型的表現與可靠性。本章節將探討如何從初始資料集的收集、檢查到驗證其適用性,確保資料品質能夠支援後續的建模工作。
高效探索初始資料集
在開始一個機器學習專案時,首要任務是收集並探索初始資料集。許多從業者在尋找完美資料集的過程中遇到困難,但實際上,我們的目標是獲得一個簡單的資料集以提取初步結果。與機器學習的其他方面一樣,從簡單開始並逐步擴充套件是明智的做法。
從小處著手
對於大多數機器學習問題而言,更多的資料確實可以帶來更好的模型,但這並不意味著我們應該從最大的可能資料集開始。在專案初期,一個小的資料集可以讓我們更容易檢查和理解資料,從而更好地進行建模。只有在確定了策略之後,才有必要將其擴充套件到更大的規模。
實踐建議
- 從小樣本開始:如果公司擁有儲存在叢集中的海量資料,可以從中抽取一個均勻抽樣的子集,使其能夠在本地機器記憶體中處理。
- 自主收集資料:對於個人專案,可以透過網路抓取、利用大型開放資料集(如Common Crawl網站上的資料)或生成資料來收集初始資料。
- 迭代最佳化:一旦看到初始模型的表現和困境,就能夠以更明智的方式迭代最佳化資料集。
資料探索的目的:洞察與產品開發
收集資料集後,我們需要深入探索其內容。在此過程中,我們需要區分為分析目的和為產品開發目的進行的資料探索。雖然兩者的目標都是提取和理解資料中的趨勢,但前者關注從趨勢中取得洞察(如發現大多數欺詐性登入發生在週四且來自西雅圖地區),而後者則是利用趨勢來構建功能(如利用登入嘗試的時間和IP地址來構建防止欺詐賬戶登入的服務)。
從洞察到產品
在產品開發過程中,我們不僅要識別趨勢,還需要確保所觀察到的模式能夠應用於未來接收的資料,並量化訓練資料與生產資料之間的差異。例如,在欺詐預測中,發現欺詐性登入的季節性趨勢是第一步,然後應利用這一觀察到的季節性趨勢來估計需要多久重新訓練模型。
資料品質評估框架
在處理新資料集時,有幾個方面需要檢查。雖然每個資料集都有其自身的偏差和特殊性,需要不同的工具來理解,但仍有一些通用的類別值得關注。
資料格式
- 輸入輸出清晰度:資料集是否已經格式化為具有清晰的輸入和輸出,還是需要額外的預處理和標註?
- 預處理驗證:如果資料集已經過處理或聚合,需要驗證是否理解了資料處理的方式,並能夠自行計算某些特徵以驗證提供的數值。
資料品質
- 缺失值檢查:檢查資料集中是否存在大量的缺失值,這對於後續的建模工作至關重要。
- 信任度評估:根據資料品質決定哪些特徵值得信賴,哪些特徵應該被忽略。
結語
在機器學習專案中,資料品質是基礎也是關鍵。透過仔細檢查和驗證初始資料集,我們可以為後續的建模工作打下堅實的基礎。從小處著手、迭代最佳化,並始終關注資料品質,是確保專案成功的關鍵策略。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 資料集迭代最佳化與品質檢驗架構
package "初始資料集取得" {
component [資料源發現] as discover
component [均勻抽樣] as sample
component [向量化處理] as vectorize
}
package "品質評估框架" {
component [資料格式檢查] as format
component [完整性評估] as complete
component [一致性驗證] as consistent
}
package "迭代最佳化流程" {
component [模型效能回饋] as feedback
component [資料集擴充] as expand
component [標註品質改進] as label
}
package "資料探索目標" {
component [趨勢發現] as trend
component [產品功能轉化] as product
component [訓練/生產差異分析] as gap
}
discover --> sample : 選取來源
sample --> vectorize : 轉換格式
format --> complete : 驗證完整
feedback --> expand : 擴大規模
note right of format
品質評估:
- 缺失值檢查
- 資料準確性
- 一致性分析
end note
note right of trend
探索目標:
- 發現規律
- 轉化功能
- 差異分析
end note
@enduml圖表翻譯: 此圖示展示了從收集初始資料集到擴充套件至更大規模的整個流程。首先,我們從收集初始資料集開始,接著探索與理解資料,然後評估資料品質並進行預處理與標註。在此基礎上,建立初步模型並進行迭代最佳化,最終擴充套件至更大規模以提升模型的表現。
資料品品檢驗:確保機器學習專案的成功基礎
在進行機器學習專案時,資料的品質對於模型的表現至關重要。資料可能存在多種品質問題,包括缺失、不精確或甚至損壞。準確評估資料品質不僅能幫助我們預估合理的效能水平,還能使我們更容易地選擇潛在的特徵和模型。
評估資料品質
使用者活動日誌:若您正在處理使用者活動日誌以預測線上產品的使用情況,您能否估計有多少日誌事件遺失?對於您所擁有的事件,有多少包含關於使用者的部分資訊?
自然語言文字:如果您正在處理自然語言文字,您如何評估文字的品質?例如,是否存在許多無法理解的字元?拼寫是否非常錯誤或不一致?
影像資料:如果您正在處理影像,影像是否足夠清晰以至於您可以自行執行任務?如果您很難在影像中檢測到物件,您認為您的模型是否會難以做到?
整體資料品質:一般來說,您的資料中有多少比例看起來是雜亂或不正確的?有多少輸入難以解讀或理解?如果資料有標籤,您是否傾向於同意它們,還是經常發現自己質疑其準確性?
實際案例
在某些專案中,例如從衛星影像中提取資訊,我們可能會遇到標註不準確或甚至缺失的情況。這種錯誤對任何建模方法都有重大影響,因此及早發現至關重要。
資料數量與分佈
在驗證資料的格式和品質後,進一步的步驟可以幫助我們主動發現問題:檢查資料數量和特徵分佈。
資料量:我們有多少資料?如果我們有龐大的資料集,我們應該選擇一個子集開始分析。另一方面,如果我們的資料集太小或某些類別代表性不足,我們訓練的模型可能會與我們的資料一樣有偏差。
特徵分佈:特徵值是否在合理的範圍內?
實踐中的資料品質評估
對於一個實際的例子,當建立一個模型來自動將客戶支援電子郵件分類別到不同的專業領域時,一位與我合作的資料科學家Alex Wahl面臨著只有九個不同類別且每個類別只有一個範例的挑戰。這樣的資料集太小,模型難以從中學習。因此,他專注於資料生成策略,使用常見表達方式的範本為九個類別中的每一個產生數千個更多的範例,從而使模型能夠學習。
ML 編輯器資料檢查
對於我們的ML編輯器,我們最初選擇使用匿名化的Stack Exchange Data Dump作為資料集。Stack Exchange是一個問答網站網路,每個網站都專注於特定的主題。資料轉儲包含許多檔案,每個檔案對應於Stack Exchange網路中的一個網站。
XML 資料解析
每個網站檔案都以XML格式提供。我們需要建立一個管道來載入這些檔案並將它們轉換成更容易分析的文字格式,例如pandas DataFrame。
import xml.etree.ElementTree as ElT
import pandas as pd
def parse_xml_to_csv(path, save_path=None):
"""
開啟.xml posts dump並將文字轉換為csv,在過程中進行標記化
:param path: 包含posts的xml檔案的路徑
:return: 處理後的文字的DataFrame
"""
# 使用python的標準函式庫解析XML檔案
doc = ElT.parse(path)
root = doc.getroot()
# 將XML資料轉換為列表
data = []
for row in root.findall('row'):
data.append({
'Id': row.attrib['Id'],
'PostTypeId': row.attrib['PostTypeId'],
'CreationDate': row.attrib['CreationDate'],
'Score': row.attrib['Score'],
'ViewCount': row.attrib.get('ViewCount', None),
'Body': row.attrib['Body'],
'OwnerUserId': row.attrib.get('OwnerUserId', None),
'LastActivityDate': row.attrib['LastActivityDate'],
'Title': row.attrib.get('Title', None),
'Tags': row.attrib.get('Tags', None),
'AnswerCount': row.attrib.get('AnswerCount', None),
'CommentCount': row.attrib.get('CommentCount', None)
})
# 將列表轉換為DataFrame
df = pd.DataFrame(data)
# 解碼HTML標籤
df['Body'] = df['Body'].apply(lambda x: html.unescape(x))
if save_path:
df.to_csv(save_path, index=False)
return df
內容解密:
- XML解析:使用
xml.etree.ElementTree解析XML檔案,並提取每個<row>元素的屬性。 - 資料轉換:將提取的資料轉換為字典列表,然後進一步轉換為pandas DataFrame,以便於分析和處理。
- HTML解碼:對
Body欄位進行HTML解碼,以還原原始的文字內容。 - CSV儲存:如果指定了儲存路徑,則將DataFrame儲存為CSV檔案。
這個函式為載入和預處理Stack Exchange資料提供了一個基礎,使得後續的分析和建模工作成為可能。
資料預處理與探索性分析
在處理與分析資料集時,我們首先需要對原始資料進行預處理,以確保資料的品質和可用性。以下程式碼展示瞭如何使用Python對資料進行預處理,包括HTML解碼、建立DataFrame以及儲存處理後的資料。
程式碼實作
root = doc.getroot()
# 每個row代表一個問題或答案
all_rows = [row.attrib for row in root.findall("row")]
# 使用tqdm顯示進度,因為預處理需要時間
for item in tqdm(all_rows):
# 從HTML中解碼文字
soup = BeautifulSoup(item["Body"], features="html.parser")
item["body_text"] = soup.get_text()
# 從字典列表建立DataFrame
df = pd.DataFrame.from_dict(all_rows)
if save_path:
df.to_csv(save_path)
return df
內容解密:
- 取得根節點:
root = doc.getroot()用於取得XML檔案的根節點。 - 提取所有row屬性:
all_rows = [row.attrib for row in root.findall("row")]用於遍歷所有row元素並提取其屬性,儲存在all_rows列表中。 - HTML解碼:使用
BeautifulSoup對每個item["Body"]進行HTML解碼,將結果儲存在item["body_text"]中,以提取純文字內容。 - 建立DataFrame:使用
pd.DataFrame.from_dict(all_rows)將字典列表轉換為DataFrame,以便於進一步分析和處理。 - 儲存DataFrame:如果提供了
save_path,則使用df.to_csv(save_path)將DataFrame儲存為CSV檔案。
資料探索
在完成資料預處理後,我們需要對資料進行探索性分析,以瞭解資料的特性和分佈。以下是使用df.info()顯示的資料摘要資訊:
>>>> df.info()
AcceptedAnswerId 4124 non-null float64
AnswerCount 33650 non-null int64
Body 33650 non-null object
ClosedDate 969 non-null object
CommentCount 33650 non-null int64
CommunityOwnedDate 186 non-null object
CreationDate 33650 non-null object
FavoriteCount 3307 non-null float64
Id 33650 non-null int64
LastActivityDate 33650 non-null object
LastEditDate 10521 non-null object
LastEditorDisplayName 606 non-null object
LastEditorUserId 9975 non-null float64
OwnerDisplayName 1971 non-null object
OwnerUserId 32117 non-null float64
ParentId 25679 non-null float64
PostTypeId 33650 non-null int64
Score 33650 non-null int64
Tags 7971 non-null object
Title 7971 non-null object
ViewCount 7971 non-null float64
body_text 33650 non-null object
full_text 33650 non-null object
text_len 33650 non-null int64
is_question 33650 non-null bool
分析結果:
- 資料集包含約33,650個帖子,其中只有約4,124個帖子具有接受的答案。
Body欄位代表帖子的內容,但檢查發現部分帖子的Body為空,需要進一步檢查和清理。
比對問題與答案
為了了解問題與其接受答案之間的關係,我們需要比對具有接受答案的問題與其對應的答案文字。
questions_with_accepted_answers = df[
df["is_question"] & ~(df["AcceptedAnswerId"].isna())
]
q_and_a = questions_with_accepted_answers.join(
df[["Text"]], on="AcceptedAnswerId", how="left", rsuffix="_answer"
)
pd.options.display.max_colwidth = 500
q_and_a[["Text", "Text_answer"]][:5]
內容解密:
- 篩選具有接受答案的問題:使用
df["is_question"] & ~(df["AcceptedAnswerId"].isna())篩選出具有接受答案的問題。 - 比對問題與答案:透過
questions_with_accepted_answers.join(df[["Text"]], on="AcceptedAnswerId", how="left", rsuffix="_answer")將問題與其接受的答案進行比對。 - 顯示比對結果:使用
q_and_a[["Text", "Text_answer"]][:5]顯示前5個問題及其對應的答案文字。
結果與討論
透過上述分析,我們可以確認問題與其接受答案之間的匹配關係,並進一步檢查文字的品質。這有助於我們瞭解資料的特性和可用性,為後續的模型訓練和分析奠定基礎。
範例結果:
| Id | body_text | body_text_answer | |
-|
|
| | 1 | 我一直想開始寫作,但是總是被許多疑問所阻礙。有沒有一些資源可以幫助我開始? | 當我思考我如何學會寫作時,我認為閱讀是最重要的。透過閱讀好的文章,我學到了其他人的寫作風格… | | 2 | 不同敘事觀點的故事型別有哪些優缺點?例如,第一人稱和第三人稱有什麼不同? | 使用第一人稱敘事可以使讀者更投入主角的情感。第三人稱則沒有這種緊密的聯絡… | | 3 | 我完成了我的小說,大家都說我需要一個代理人。如何找到一個? | 試著找出你所屬型別的小說代理人,檢視他們的網站,瞭解他們是否接受新客戶… |
透過這些範例,我們可以看到問題與其接受答案之間的相關性,從而驗證了我們比對方法的正確性。