# 資料預處理 ## 目的 [機器學習最強入門](https://hackmd.io/uQa0aQHiQX2DX0dD2HDe-g#22-4-scikit-learn-%E6%95%B8%E6%93%9A%E9%A0%90%E8%99%95%E7%90%86) scikit-learn 的數據預處理的主要目的有以下幾點: * 數據清洗:消除數據中的躁聲。 * 數據轉換:將數據轉換為適合模型學習的格式。 * 數據標準化/正規化:可以消除數據的尺度差異,讓所有特徵都在相同的尺度範圍內。 * 特徵選擇/提取:有時需要減少數據的維度以減少運算量或者將原始特徵轉換成能更好地表示數據的新特徵。 -- ## Label Encoding [GrandmaCan](https://hackmd.io/-3To_y9fTDOLnlykaaTB6w?view#%E8%B3%87%E6%96%99%E9%A0%90%E8%99%95%E7%90%86---Label-Encoding) * 問題:學歷和工作地點是文字型特徵,無法直接套用於數學模型。 * 方式:使用 Label Encoding 將文字型特徵轉換為數字表示。 * 實作:建立字典,將文字值映射為數字,例如:高中以下 → 0,大學 → 1,碩士以上 → 2。 * 目的:是確保資料能夠適用於模型訓練,而 Label Encoding 是實現這個目標的一種手段。 --- ## One-Hot Encoding [GrandmaCan](https://hackmd.io/-3To_y9fTDOLnlykaaTB6w?view#%E8%B3%87%E6%96%99%E9%A0%90%E8%99%95%E7%90%86---One-Hot-Encoding) * 解釋 * 當一個特徵沒有高低或大小的順序關係時,使用 One-Hot Encoding。 * One-Hot Encoding 可將一個特徵轉換為多個二元特徵,每個特徵代表原始特徵的一個類別。 * 問題 * 工作地點特徵有三種可能的值:城市a、城市b、城市c。 * 步驟 * 為每個類別創建一個二元特徵,將原始特徵的每個值映射到一個新的二元特徵。 * 以城市為例,建立城市a、城市b、城市c三個新特徵,每個特徵代表一個城市。 * 將原始特徵的值轉換為二元特徵,存在的城市標記為1,其他為0。 --- [機器學習最強入門](https://hackmd.io/uQa0aQHiQX2DX0dD2HDe-g#22-7-1-One-hot-%E7%B7%A8%E7%A2%BC) One-hot 編碼方法的主要優點是可以將類別數據轉換為機器學習算法更容易處理的數值數據。 One Hot 編碼的步驟如下: 1. 確定類別型別變數中的所有唯一類別。 2. 為每個類別建立一個新的二進特徵,其取值為 0 或 1。 3. 對每個觀測值、樣本,將該觀測值的類別特徵對應的二進制特徵設為 1,其餘二進制特徵設為 0。 ``` color_blue color_green color_red 0 False False True 1 True False False 2 False True False 3 True False False ``` One-hot 編碼的主要優點是可以將類別數據轉換為機器學習算法更容易處理的數值數據,並且可以避免模型對類別的數值大小產生錯誤的解釋。 One-hot 編碼也會導致數據為度的增加,特別是在類別數量較多時,可能會增加計算成本和儲存成本。 ## Train & Test [GrandmaCan](https://hackmd.io/-3To_y9fTDOLnlykaaTB6w?view#%E8%B3%87%E6%96%99%E9%A0%90%E8%99%95%E7%90%86---Train-amp-Test) * 目的:將資料分為訓練集(Train Set)和測試集(Test Set),以便在模型訓練後進行評估。 * 方法:使用train_test_split函數,通常設定test_size指定測試集佔總資料的比例。 ## 數據轉換 [機器學習最強入門 - 機器學習必須會的非數值資料轉換](https://hackmd.io/uQa0aQHiQX2DX0dD2HDe-g?both#22-7-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%BF%85%E9%A0%88%E6%9C%83%E7%9A%84%E9%9D%9E%E6%95%B8%E5%80%BC%E8%B3%87%E6%96%99%E8%BD%89%E6%8F%9B) * One-hot 編碼 One-hot 編碼方法的主要優點是可以將類別數據轉換為機器學習算法更容易處理的數值數據。 * ch22_15_6: color 數據字典轉換 * 特徵名稱由中文改為英文 * ch22_15_7: 將特徵欄位轉換成英文 * 資料對應 map() 方法 使用 map() 方法將資料轉為機器學習可以處理的數值資料。 * ch22_15_8: 將學歷文字轉換為數字 * 標籤轉換 LabelEncoder() 用於將標籤、目標變數標籤轉換為介於 0 和 n_classes-1 之間的數值。 這種轉換可以對定性數據進行量化處理,使其能夠被機器學習演算法使用。 * ch22_15_9: 使用 LabelEncoder 對 fruits 進行轉換 * ch22_15_10: 將 7x3 陣列的文字標籤轉成數字標籤 ## 白化 白化,是一種數據前處理技術,其目的是去除數據各個特徵之間的關聯性,並使得每個特徵都具有相同的變異數。 ## 常見的資料清理方法 * 填充缺失值: 可以使用平均值、中位數、眾數等統計量填充缺失值,而不是直接移除。 * 使用插值方法: 對於時間序列資料,可以使用插值方法來預測缺失值。 * 處理離群值: 對於可能的離群值,可以使用統計方法或者箱型圖等來檢測和處理。 * 使用機器學習模型預測缺失值: 可以使用其他特徵預測缺失值,例如使用機器學習模型,但這通常僅適用於缺失值較少的情況。 --- 對於數值型特徵,填補缺失值為平均值或中位數 對於類別型特徵,填補缺失值為眾數 --- 好的,以下是一個差異表格,列出了常見的處理缺失值的方法、它們的使用時機、優點和缺點: | 方法 | 使用時機 | 優點 | 缺點 | |------------------------|--------------------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| | 刪除缺失值 | 缺失值佔比較小,刪除不會對數據影響大的情況 | - 簡單易行 - 不影響其他特徵的值 | - 可能導致信息損失 - 若缺失值佔比過大,可能導致樣本數減少,影響模型訓練效果 | | 均值/中位數/眾數填充 | 數值型特徵且分佈比較集中的情況 | - 簡單快捷 - 不受極端值影響 | - 可能導致數據分佈偏差 - 不考慮特徵之間的相關性 | | 使用預測模型填充 | 數據集具有複雜的特徵關係,且缺失值較多的情況 | - 考慮了特徵之間的相關性 - 填充值更加準確 | - 計算成本較高 - 需要訓練額外的預測模型 | | 使用KNN填充 | 數據集具有複雜的特徵關係,且缺失值較多的情況 | - 考慮了特徵之間的相關性 - 填充值相對準確 | - 計算成本較高 - K值的選擇需要優化 | | 插值法填充 | 數值型特徵且存在連續性的情況 | - 考慮了數據的連續性 - 填充值相對準確 | - 可能導致填充值的誤差 - 對於高維度數據,插值法的計算成本較高 | | 使用特殊標記填充 | 缺失值有特殊含義或對數據分析有用的情況 | - 保留了缺失值的特殊含義 - 不影響其他特徵的值 | - 可能需要額外的解釋或處理 | | 使用專業知識填充 | 需要根據領域知識來填充缺失值的情況 | - 可以根據領域知識填充準確的值 - 不影響其他特徵的值 | - 需要專業知識 - 需要額外的人工成本來收集和應用領域知識 | 這些方法都有各自的優點和缺點,選擇哪一種方法取決於數據的性質、缺失值的分佈情況以及任務的需求。 ## 資料處理的常見步驟和技巧 ### 1. 資料收集: 收集與您問題相關的資料。這可能包括從不同來源收集資料,如數據庫、API、日誌文件、CSV文件等。 ### 2. 資料清理: 清理資料以處理缺失值、異常值、重複值等。這可以通過填充缺失值、刪除異常值或進行數據插值等方法完成。 資料清理是機器學習中一個至關重要的步驟,目的是確保資料的品質,使其適合模型訓練。以下是一些資料清理的主要步驟和技巧: 1. **處理缺失值:** 缺失值是資料中常見的問題。處理方法包括填充缺失值或刪除包含缺失值的行或列。填充的方法可以是使用平均值、中位數、眾數,或根據相鄰數據進行插值。 ```python # 使用 pandas 填充缺失值的例子 import pandas as pd # 假設 df 是包含缺失值的 DataFrame df.fillna(df.mean(), inplace=True) ``` 2. **處理異常值:** 異常值可能對模型產生不良影響。您可以使用統計方法,例如 Z 分數或四分位距離,來檢測和處理異常值。異常值的處理方式包括刪除、替換為極值或使用平滑技術。 ```python # 刪除異常值的例子 Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 df = df[~((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).any(axis=1)] ``` 3. **處理重複值:** 如果資料中存在重複的樣本或行,應該將其刪除,以避免對模型產生不必要的影響。 ```python # 刪除重複值的例子 df.drop_duplicates(inplace=True) ``` 4. **類別特徵的處理:** 如果資料中包含類別特徵,需要將其轉換為模型可以處理的形式。這可能包括獨熱編碼、標籤編碼或其他適當的方法。 ```python # 使用 pandas 進行獨熱編碼的例子 df = pd.get_dummies(df, columns=['categorical_column']) ``` 5. **時間格式的處理:** 如果資料中包含時間戳記,應該將其轉換為模型可以理解的格式。這可以包括將時間戳記分解為年、月、日等。 ```python # 使用 pandas 處理時間格式的例子 df['timestamp'] = pd.to_datetime(df['timestamp']) df['year'] = df['timestamp'].dt.year ``` 6. **標準化和正規化:** 對數值特徵進行標準化(使其均值為0,標準差為1)或正規化(縮放到特定範圍,例如[0, 1])有助於模型更快地收斂。 ```python # 使用 scikit-learn 進行標準化的例子 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() df[['numeric_feature1', 'numeric_feature2']] = scaler.fit_transform(df[['numeric_feature1', 'numeric_feature2']]) ``` 這些步驟和技巧只是資料清理過程的一部分。在實際應用中,可能需要根據資料的特性和問題的要求進行更進一步的處理。清理資料的目標是提高模型的性能,減少對模型的負面影響。 ### 3. 資料探索性分析(EDA): 使用統計和視覺化工具來瞭解資料的特性和分佈。這有助於發現模式、趨勢和可能的關聯,並指導後續的建模過程。 資料探索性分析(Exploratory Data Analysis,EDA)是一個在進行統計建模或機器學習前的重要階段,目的是通過統計圖表和描述性統計等方法,深入了解資料的特性、結構和趨勢。以下是進行資料探索性分析的主要步驟和技巧: 1. **獲取資料概覽:** 查看資料的開頭和尾部,以了解資料的結構、欄位和格式。使用 `head()`、`tail()` 函數可以顯示資料的前幾行和後幾行。 ```python # 使用 pandas 顯示資料開頭和尾部的例子 print(df.head()) print(df.tail()) ``` 2. **統計描述:** 使用描述性統計量(如平均值、中位數、標準差等)獲取對數據分佈的整體理解。`describe()` 函數可以提供數值特徵的基本統計摘要。 ```python # 使用 pandas 顯示統計描述的例子 print(df.describe()) ``` 3. **單變量分析:** 對每個變量進行單變量分析,包括直方圖、箱線圖、條形圖等,以了解變量的分佈和範圍。 ```python # 使用 matplotlib 和 seaborn 進行單變量分析的例子 import matplotlib.pyplot as plt import seaborn as sns sns.histplot(df['numeric_feature'], kde=True) plt.show() ``` 4. **雙變量分析:** 分析兩個變量之間的關係,使用散點圖、熱圖等。這有助於理解變量之間的相互作用和可能的關聯。 ```python # 使用 seaborn 進行雙變量分析的例子 sns.scatterplot(x='feature1', y='feature2', data=df) plt.show() ``` 5. **類別變量分析:** 對類別變量進行分析,使用計數圖、箱線圖等。這可以幫助理解類別變量的分佈和影響。 ```python # 使用 seaborn 進行類別變量分析的例子 sns.countplot(x='category', data=df) plt.show() ``` 6. **缺失值分析:** 查看資料中是否存在缺失值,了解缺失值的分佈和模式。這有助於制定缺失值處理策略。 ```python # 使用 seaborn 繪製缺失值熱圖的例子 sns.heatmap(df.isnull(), cbar=False, cmap='viridis') plt.show() ``` 7. **相關性分析:** 分析數值變量之間的相關性,可以使用相關矩陣、熱圖等。這有助於理解變量之間的相互關係。 ```python # 使用 seaborn 繪製相關性熱圖的例子 correlation_matrix = df.corr() sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm') plt.show() ``` 8. **特殊資料類型分析:** 如果資料包含特殊類型的資料,如文本、時間序列等,則需要進行相應的分析。例如,使用詞頻分析、時間序列圖等。 這些步驟和技巧有助於發現資料中的模式、趨勢、異常值等,為進一步建立模型和處理資料提供有價值的指導。資料探索性分析的結果應該與後續的特徵工程和模型訓練相結合,以確保最終建立的模型是基於對資料全面理解的基礎上。 ### 4. 特徵工程: 在建立模型之前,通常需要進行特徵工程,這涉及創建新的特徵或轉換現有的特徵,以提高模型的性能。這可能包括標準化、正規化、類別特徵編碼、創建交互特徵等。 特徵工程是機器學習中一個至關重要的步驟,它涉及到從原始資料中提取、轉換和創建新的特徵,以提高模型的性能和泛化能力。良好的特徵工程可以使模型更容易理解和解釋,同時提供更好的預測性能。以下是特徵工程的一些主要步驟和技巧: 1. **特徵提取:** 從原始資料中提取有價值的特徵。這可以包括數值、類別、文本、時間等不同類型的特徵。 - **數值特徵:** 可以使用統計摘要、分位數、差分等方式進行提取。 - **類別特徵:** 使用獨熱編碼(One-Hot Encoding)、標籤編碼(Label Encoding)等方式轉換為模型可接受的形式。 - **文本特徵:** 使用詞袋模型、TF-IDF(Term Frequency-Inverse Document Frequency)等方式轉換為數值表示。 - **時間特徵:** 從時間戳記中提取年、月、日、星期幾等相關信息。 2. **特徵轉換:** 對原始特徵進行轉換,以改善模型的性能。這可以包括: - **標準化和正規化:** 將數值特徵縮放到相同的範圍,避免某些特徵尺度過大對模型造成的影響。 - **對數轉換:** 對偏度較大的數值特徵進行對數轉換,使其更接近正態分佈。 - **多項式特徵:** 將數值特徵的高次項加入特徵空間,增加模型的擬合能力。 3. **特徵創建:** 創建新的特徵,以提供更多有關資料的信息。 - **交互特徵:** 結合兩個或多個特徵,創建新的特徵,以捕捉它們的組合效應。 - **特徵合併:** 將多個相關的特徵合併成一個,減少冗餘信息。 - **群聚特徵:** 使用群聚算法將樣本分組,然後將每個群聚的統計特徵添加到資料中。 4. **特徵篩選:** 選擇對模型性能有最大影響的特徵。 - **相關性分析:** 使用相關矩陣或相關係數分析特徵之間的相關性。 - **特徵重要性:** 使用樹狀模型(如決策樹、隨機森林)的特徵重要性評估。 - **嵌入式方法:** 在模型訓練過程中,使用正則化方法(如L1正則化)來自動選擇特徵。 5. **處理類別不平衡:** 如果資料中的類別不平衡,可以使用技巧如過採樣、欠採樣,或使用合成樣本的方法來平衡類別。 6. **適應性特徵處理:** 考慮模型的特殊需求,如深度學習中的嵌入層或卷積層。 在實際應用中,特徵工程通常是一個迭代的過程,需要根據模型的表現和領域知識進行不斷調整和優化。透過良好的特徵工程,可以使模型更有效地學習資料的模式,提高預測性能。 ### 5. 資料轉換: 根據所選擇的機器學習模型,可能需要將資料進行轉換,例如將文本轉換為數字表示(詞袋模型、TF-IDF等),或對圖像進行預處理(大小調整、正規化等)。 資料轉換是指將原始資料進行修改或處理,以滿足機器學習模型的需求。這包括將不同類型的資料(如數值、類別、時間、文本)轉換成模型可以理解的形式。以下是一些常見的資料轉換技巧: 1. **數值特徵的標準化和正規化:** - **標準化(Standardization):** 將數值特徵縮放到均值為0,標準差為1的標準分佈。標準化有助於確保不同特徵具有相似的尺度。 - **正規化(Normalization):** 將數值特徵縮放到一個指定的範圍,通常是[0, 1]。正規化對於某些模型(如神經網絡)的收斂速度很有幫助。 ```python from sklearn.preprocessing import StandardScaler, MinMaxScaler # 使用標準化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 使用正規化 min_max_scaler = MinMaxScaler() X_normalized = min_max_scaler.fit_transform(X) ``` 2. **類別特徵的編碼:** - **獨熱編碼(One-Hot Encoding):** 將類別特徵轉換為二進制矩陣,每個類別對應一列。這樣可以處理模型只接受數值輸入的情況。 - **標籤編碼(Label Encoding):** 將類別特徵映射為整數,常用於某些樹狀模型,但可能導致模型將數字解釋為順序。 ```python from sklearn.preprocessing import OneHotEncoder, LabelEncoder # 使用獨熱編碼 encoder = OneHotEncoder() X_encoded = encoder.fit_transform(X[['category']]) # 使用標籤編碼 label_encoder = LabelEncoder() X['category_encoded'] = label_encoder.fit_transform(X['category']) ``` 3. **時間特徵的處理:** - **提取時間信息:** 從時間戳記中提取年、月、日、小時等信息,以便模型更好地理解時間模式。 - **週期性特徵:** 考慮到時間的週期性,可以使用正弦和餘弦函數轉換時間特徵。 ```python import pandas as pd # 提取時間信息 df['timestamp'] = pd.to_datetime(df['timestamp']) df['year'] = df['timestamp'].dt.year df['month'] = df['timestamp'].dt.month # 創建週期性特徵 df['sin_month'] = np.sin(2 * np.pi * df['month'] / 12) df['cos_month'] = np.cos(2 * np.pi * df['month'] / 12) ``` 4. **文本特徵的處理:** - **詞袋模型(Bag of Words):** 將文本轉換為詞頻或 TF-IDF(Term Frequency-Inverse Document Frequency)表示,以供模型處理。 - **Word Embeddings:** 使用詞嵌入(如Word2Vec、GloVe)將文本轉換為密集的向量表示。 ```python from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer # 使用詞袋模型 vectorizer = CountVectorizer() X_bow = vectorizer.fit_transform(X['text']) # 使用TF-IDF tfidf_vectorizer = TfidfVectorizer() X_tfidf = tfidf_vectorizer.fit_transform(X['text']) ``` 5. **特徵合併和交互特徵:** - **合併特徵:** 將多個相似的特徵合併成一個,減少冗餘信息。 - **交互特徵:** 創建新的特徵,為不同特徵的組合,以提供更多信息。 ```python # 合併特徵 df['combined_feature'] = df['feature1'] + df['feature2'] # 交互特徵 df['interaction_feature'] = df['feature1'] * df['feature2'] ``` 這些是一些常見的資料轉換技巧,實際應用中可能需要根據資料的特性和模型的需求進行更進一步的調整和優化。資料轉換的目標是確保模型能夠有效地處理輸入資料,並提供更好的性能。 ### 6. 資料劃分: 將資料集分為訓練集、驗證集和測試集,以便評估模型的性能。這有助於防止過度擬合(overfitting)和提供對模型泛化能力的更好估計。 資料劃分是機器學習中的一個重要步驟,它將資料集分為訓練集、驗證集和測試集,以確保模型在不同階段都能夠有效地訓練、調優和評估。以下是一些關於資料劃分的詳細說明: 1. **訓練集(Training Set):** 訓練集是模型用來學習模型參數的資料。模型通過訓練集進行反覆的訓練和更新,以找到最佳的參數配置。通常,訓練集應占整個資料集的大部分,例如 60% 到 80%。 2. **驗證集(Validation Set):** 驗證集是用來調優模型超參數(例如學習率、正則化項等)的資料。通過在訓練集上訓練模型,然後在驗證集上評估模型的性能,可以調整模型以提高泛化能力。驗證集的比例通常是整個資料集的 10% 到 20%。 3. **測試集(Test Set):** 測試集是用來評估最終模型性能的資料。模型在測試集上的表現反映了它對未見過資料的泛化能力。測試集的比例通常是整個資料集的 10% 到 20%。 4. **隨機劃分和分層劃分:** - **隨機劃分:** 資料集中的樣本通常是隨機排列的,然後按照劃分比例劃分成訓練、驗證和測試集。這種方法的缺點是可能導致某些類別在某一集合中的樣本過多或過少。 - **分層劃分:** 保持每個類別在每個集合中的分佈相對一致,以確保不會在某個集合中缺乏某些類別。這對於類別平衡的資料集特別重要。 ```python from sklearn.model_selection import train_test_split # 隨機劃分 X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.2, random_state=42) # 再次劃分 X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42) ``` 5. **時間序列資料的劃分:** 對於時間序列資料,劃分應該按照時間順序進行,以確保模型在訓練時只能使用過去的資料。例如,可以根據時間將資料集分為訓練和測試兩部分。 ```python # 根據時間劃分 train_size = int(len(df) * 0.8) train, test = df[:train_size], df[train_size:] ``` 6. **交叉驗證:** 有時,為了更好地估計模型的性能,可以使用交叉驗證。這包括將資料集劃分為多個折數(folds),模型在每個折數上訓練和評估。這有助於減少對特定劃分的依賴性。 ```python from sklearn.model_selection import cross_val_score, KFold # 交叉驗證 kfold = KFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(model, X, y, cv=kfold) ``` 7. **資料不平衡的處理:** 如果資料集中的類別分佈不平衡,確保每個集合中都包含足夠的正例和負例樣本,以防止模型的不合理偏向。 ```python from sklearn.model_selection import StratifiedShuffleSplit # 分層劃分處理不平衡資料 sss = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42) for train_index, test_index in sss.split(X, y): X_train, X_test = X.iloc[train_index], X.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] ``` 資料劃分的過程根據資料的性質、模型的需求以及目標的不同而有所變化。在實際應用中,需要根據具體情況靈活運用這些方法。確保良好的資料劃分有助於模型的訓練、調優和評估,提高模型的性能和泛化能力。 ### 7. 處理類別不平衡: 如果資料中的類別分佈不均衡,可能需要應用類別平衡技術,如過採樣(oversampling)或欠採樣(undersampling),以確保模型在所有類別上有適當的性能。 處理類別不平衡是機器學習中的一個重要議題,特別是當目標類別的樣本數量明顯不均衡時。這種不平衡可能導致模型對多數類別的預測效果優於少數類別,影響模型的泛化能力。以下是一些處理類別不平衡的常見方法: 1. **過採樣(Over-sampling):** - **隨機過採樣:** 從少數類別中隨機選擇樣本,使其數量增加到與多數類別相近。 - **SMOTE(Synthetic Minority Over-sampling Technique):** 生成合成樣本,通過在特徵空間中對少數類別樣本之間的距離進行插值。 ```python from imblearn.over_sampling import RandomOverSampler, SMOTE # 隨機過採樣 ros = RandomOverSampler(random_state=42) X_resampled, y_resampled = ros.fit_resample(X, y) # 使用SMOTE smote = SMOTE(random_state=42) X_resampled, y_resampled = smote.fit_resample(X, y) ``` 2. **欠採樣(Under-sampling):** - **隨機欠採樣:** 從多數類別中隨機選擇樣本,使其數量減少到與少數類別相近。 - **Tomek Links:** 移除多數類別和少數類別之間的Tomek Links,這是一對彼此靠近但屬於不同類別的樣本對。 ```python from imblearn.under_sampling import RandomUnderSampler, TomekLinks # 隨機欠採樣 rus = RandomUnderSampler(random_state=42) X_resampled, y_resampled = rus.fit_resample(X, y) # 使用Tomek Links tl = TomekLinks() X_resampled, y_resampled = tl.fit_resample(X, y) ``` 3. **合成樣本(Synthetic Sampling):** 生成合成樣本以平衡類別數量。除了SMOTE,還有其他合成樣本的方法,如ADASYN(Adaptive Synthetic Sampling)。 ```python from imblearn.over_sampling import ADASYN # 使用ADASYN adasyn = ADASYN(random_state=42) X_resampled, y_resampled = adasyn.fit_resample(X, y) ``` 4. **類別權重(Class Weights):** 在模型訓練過程中,賦予不同類別不同的權重,以反映類別不平衡。這通常在支持向量機、決策樹和隨機森林等模型中實現。 ```python from sklearn.ensemble import RandomForestClassifier # 設置類別權重 class_weights = {0: 1, 1: 10} # 根據實際情況調整權重 model = RandomForestClassifier(class_weight=class_weights) ``` 5. **評估指標的選擇:** 考慮使用適合處理不平衡類別的評估指標,如精確度(Accuracy)可能不適合,可以使用精確度-召回曲線、F1分數、AUC-ROC等。 ```python from sklearn.metrics import classification_report # 使用classification_report輸出評估指標 print(classification_report(y_true, y_pred)) ``` 6. **集成方法:** 使用集成學習方法,如適應性合成抽樣(Adaptive Synthetic Sampling,ADASYN)的集成版本,或使用集成過採樣和欠採樣的組合。 這些方法可以單獨使用,也可以組合使用,視具體情況而定。選擇適當的方法需要考慮資料的特性、模型的選擇,以及最終目標。根據具體情況,可能需要嘗試多種方法來找到最適合的處理類別不平衡的策略。 ### 8. 處理時間序列資料: 如果您處理的是時間序列資料,則可能需要進行時間序列的相關處理,如平滑、移動平均、差分等。 處理時間序列資料在機器學習中是一個特殊的挑戰,因為資料點的順序和時間之間的相互關係非常重要。以下是處理時間序列資料的一些建議和技巧: 1. **資料觀察:** 開始前先對時間序列資料進行視覺化和觀察。這包括繪製時間序列圖、自相關圖(Autocorrelation plot)和趨勢分析,以了解資料的模式和可能存在的趨勢。 ```python import matplotlib.pyplot as plt # 繪製時間序列圖 plt.plot(df['timestamp'], df['value']) plt.xlabel('Timestamp') plt.ylabel('Value') plt.show() # 繪製自相關圖 pd.plotting.autocorrelation_plot(df['value']) plt.show() ``` 2. **特徵提取:** 從時間戳記中提取有用的特徵,例如年、月、日、小時、星期幾等。這有助於模型更好地理解資料。 ```python df['timestamp'] = pd.to_datetime(df['timestamp']) # 提取時間特徵 df['year'] = df['timestamp'].dt.year df['month'] = df['timestamp'].dt.month df['day'] = df['timestamp'].dt.day ``` 3. **缺失值處理:** 處理時間序列資料中的缺失值可能需要使用插值方法或基於鄰近值的填充方法。在時間序列中,鄰近時間點的值可能是合理的填充。 ```python # 使用前一個時間點的值填充缺失值 df['value'].fillna(method='ffill', inplace=True) ``` 4. **平滑處理:** 對於具有噪聲的時間序列,可以使用平滑技術,如移動平均或指數平滑,以減少噪聲並突顯趨勢。 ```python # 使用移動平均進行平滑處理 df['smoothed_value'] = df['value'].rolling(window=3).mean() ``` 5. **時間窗口:** 將時間序列資料轉換為時間窗口形式,以便模型能夠捕捉到窗口內的模式。這包括使用滑動窗口或展開窗口。 ```python # 使用滑動窗口創建時間序列特徵 window_size = 3 for i in range(len(df) - window_size + 1): df.loc[i, 'window_mean'] = df['value'].iloc[i:i+window_size].mean() ``` 6. **時間序列差分:** 對時間序列進行差分,以移除趨勢,使其更加平穩。這有助於將非平穩時間序列轉換為平穩時間序列。 ```python # 進行一階差分 df['diff'] = df['value'].diff() ``` 7. **時間序列分解:** 對時間序列進行分解,將其分為趨勢、季節性和殘差。這有助於更好地理解時間序列的結構。 ```python from statsmodels.tsa.seasonal import seasonal_decompose # 時間序列分解 result = seasonal_decompose(df['value'], model='additive', period=12) df['trend'] = result.trend df['seasonal'] = result.seasonal df['residual'] = result.resid ``` 8. **建立時間序列模型:** 使用時間序列模型,如ARIMA(差分整合移動平均)、Prophet、LSTM等,來預測未來的值。這些模型可以捕捉時間序列中的趨勢和季節性。 ```python from statsmodels.tsa.arima.model import ARIMA from fbprophet import Prophet # 使用ARIMA模型 model = ARIMA(df['value'], order=(1, 1, 1)) results = model.fit() # 使用Prophet模型 model = Prophet() model.fit(df[['ds', 'y']]) ``` 9. **模型評估:** 使用合適的評估指標,如均方根誤差(RMSE)、平均絕對誤差(MAE)等,來評估模型的性能。 ```python from sklearn.metrics import mean_squared_error # 計算均方根誤差 rmse = mean_squared_error(df['actual'], df['predicted'], squared=False) ``` 這些方法可以根據時間序列資料的特性進行組合和調整。處理時間序列資料的過程需要結合領域知識和實際應用情境,以找到最適合的方法。 ### 9. 資料管道: 創建資料處理的管道,以便將所有步驟組織起來,方便反覆使用和自動化。 資料管道(Data Pipeline)在機器學習中是一個重要的概念,它指的是將資料的處理步驟整合到一個連貫的流程中,以便進行預處理、特徵工程、模型訓練和評估等操作。資料管道有助於提高代碼的可讀性、可維護性,同時使整個機器學習工作流更加流暢。以下是處理資料管道的一些建議和技巧: 1. **資料收集:** 資料管道的開始是資料的收集階段。這可能涉及從不同來源獲取資料、讀取資料庫、API請求等。使用適當的工具和函式庫來讀取和載入資料。 ```python import pandas as pd # 從CSV檔案讀取資料 data = pd.read_csv('data.csv') # 從API請求獲取資料 import requests response = requests.get('https://api.example.com/data') data = response.json() ``` 2. **資料清理:** 在資料管道中進行資料清理,處理缺失值、重複值、異常值等。確保資料的一致性和可靠性。 ```python # 處理缺失值 data.dropna(inplace=True) # 處理重複值 data.drop_duplicates(inplace=True) # 處理異常值 data = data[(data['value'] >= lower_bound) & (data['value'] <= upper_bound)] ``` 3. **特徵工程:** 在資料管道中進行特徵工程,包括特徵提取、轉換和創建。這可能涉及對數值、類別、時間等不同類型的特徵進行處理。 ```python from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 定義數值特徵和類別特徵 numeric_features = ['feature1', 'feature2'] categorical_features = ['category'] # 建立特徵轉換器 numeric_transformer = Pipeline(steps=[ ('scaler', StandardScaler()) ]) categorical_transformer = Pipeline(steps=[ ('onehot', OneHotEncoder()) ]) # 組合特徵轉換器 preprocessor = ColumnTransformer( transformers=[ ('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features) ]) # 將特徵工程整合到資料管道中 data_pipe = Pipeline(steps=[('preprocessor', preprocessor)]) transformed_data = data_pipe.fit_transform(data) ``` 4. **資料劃分:** 在資料管道中進行資料劃分,將資料集分為訓練集、驗證集和測試集。 ```python from sklearn.model_selection import train_test_split # 資料劃分 X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.2, random_state=42) X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42) ``` 5. **模型訓練:** 在資料管道中進行模型訓練,使用適當的機器學習算法。 ```python from sklearn.ensemble import RandomForestClassifier # 建立模型 model = RandomForestClassifier() # 訓練模型 model.fit(X_train, y_train) ``` 6. **模型評估:** 在資料管道中進行模型評估,使用適當的評估指標。 ```python from sklearn.metrics import accuracy_score # 預測 y_pred = model.predict(X_val) # 評估 accuracy = accuracy_score(y_val, y_pred) ``` 7. **模型部署:** 在資料管道中進行模型部署,將訓練好的模型應用於實際情境。 ```python import joblib # 儲存模型 joblib.dump(model, 'trained_model.joblib') # 載入模型 loaded_model = joblib.load('trained_model.joblib') ``` 8. **維護和更新:** 定期維護和更新資料管道,以確保它保持與實際需求 的一致性。這可能包括更新資料收集過程、調整特徵工程、更新模型等。 資料管道的構建可以使用多種工具和函式庫,如scikit-learn、TensorFlow Extended(TFX)、Apache Airflow等。這些工具提供了方便的界面和函式庫,以加速資料管道的開發和管理。資料管道的建立是一個靈活的過程,可以根據具體應用的需求進行調整。 ### 10. 資料正規化和標準化: 根據模型的需求,對資料進行正規化(歸一化)或標準化,以確保不同特徵的尺度一致。 資料正規化(Normalization)和標準化(Standardization)是在機器學習中常用的兩種資料預處理技術,它們的目標是將資料轉換為一個標準範圍,有助於提高模型的收斂速度、穩定性,並確保不同特徵的權重被合理地考慮。以下是對這兩種技術的詳細解釋: #### 資料正規化(Normalization) 資料正規化的目標是將資料縮放到一個特定的範圍,通常是[0, 1]。這是通過將每個數據點減去最小值,然後除以範圍(最大值減最小值)來實現的。正規化適用於那些特徵具有固定界限且差異不大的情況。 正規化公式: \[ x_{\text{normalized}} = \frac{x - \text{min}(x)}{\text{max}(x) - \text{min}(x)} \] 在Python中,可以使用scikit-learn的`MinMaxScaler`實現正規化: ```python from sklearn.preprocessing import MinMaxScaler # 創建MinMaxScaler實例 scaler = MinMaxScaler() # 使用fit_transform進行正規化 X_normalized = scaler.fit_transform(X) ``` #### 標準化(Standardization) 標準化的目標是將資料轉換成均值為0、標準差為1的分佈。這是通過將每個數據點減去平均值,然後除以標準差實現的。標準化對於特徵的分佈比較寬或存在明顯離群值的情況更為適用。 標準化公式: \[ x_{\text{standardized}} = \frac{x - \text{mean}(x)}{\text{std}(x)} \] 在Python中,可以使用scikit-learn的`StandardScaler`實現標準化: ```python from sklearn.preprocessing import StandardScaler # 創建StandardScaler實例 scaler = StandardScaler() # 使用fit_transform進行標準化 X_standardized = scaler.fit_transform(X) ``` #### 正規化 vs. 標準化 - **範圍不同:** 正規化將數據縮放到\[0, 1\]的範圍內,而標準化使數據的均值為0,標準差為1。 - **對離群值的敏感度:** 正規化對於離群值非常敏感,因為它使用了最小值和最大值,而標準化對離群值的影響相對較小,因為它使用均值和標準差。 - **應用場景:** 正規化通常適用於特徵具有固定範圍且差異不大的情況,而標準化更適用於特徵的分佈較寬或存在明顯離群值的情況。 選擇正規化還是標準化取決於數據的特性和應用的具體要求。在實際應用中,可以嘗試不同的預處理方法,然後觀察模型的性能,以找到最適合的方法。 --- --- # 範例 ![機器學習使用 scikit-learn 入門](https://hackmd.io/_uploads/SyjAGObbA.png) ## 認識數據 ### 第 23 章 線性迴歸 - 波士頓房價 #### 23-3-1 認識波士頓房價數據集 波士頓房價數據集包含 13 個特徵(自變數),用於預測房價,和 1 個目標變數。 13 個特徵(自變數) - CRIM per capita crime rate by town - ZN proportion of residential land zoned for lots over 25,000 sq.ft. - INDUS proportion of non-retail business acres per town - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) - NOX nitric oxides concentration (parts per 10 million) - RM average number of rooms per dwelling - AGE proportion of owner-occupied units built prior to 1940 - DIS weighted distances to five Boston employment centres - RAD index of accessibility to radial highways - TAX full-value property-tax rate per $10,000 - PTRATIO pupil-teacher ratio by town - B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town - LSTAT % lower status of the population 目標變數 - MEDV Median value of owner-occupied homes in $1000's ---- ### 第 24 章 邏輯迴歸 - 信用卡/葡萄酒/糖尿病 #### 24-4-1 認識 UCI_Credit_Card.csv 數據 ![image](https://hackmd.io/_uploads/HJKKvFbbR.png) #### 24-6-1 認識糖尿病數據 糖尿病數據集包含 8 個特徵(自變數)和 1 個目標變數。 8 個特徵(自變數) * Preg = Number of times pregnant * Glucose = Plasma glucose concentration a 2 hours in an oral glucose tolerance test * BP = Diastolic blood pressure (mm Hg) * Skin = Triceps skin fold thickness (mm) * Insulin = 2-Hour serum insulin (mu U/ml) * BMI = Body mass index (weight in kg/(height in m)^2) * Pedi = Diabetes pedigree function * Age = Age (years) 目標變數: * Outcome:是否有糖尿病。 ![image](https://hackmd.io/_uploads/BkcoqIOS6.png) ### 第 25 章 決策樹 - 葡萄酒/鐵達尼號/Telco/Retail #### 25-4-1 認識鐵達尼號數據集 ![image](https://hackmd.io/_uploads/By_xPM9HT.png) ![image](https://hackmd.io/_uploads/Hkrbwz5ST.png) #### 25-5-1 認識 UCI_Credit_Card.csv 數據 ### 第 26 章 隨機森林樹 - 波士頓房價/鐵達尼號/Telco/收入分析 #### 26-5 美國成年人收入分析 – 分類應用 ##### 26-5-1 認識 adult.csv 數據 收入 income 是目標變數 ch26_5.py 認識與預處理 adult.csv 數據 ![image](https://hackmd.io/_uploads/Bknpj32B6.png) ### 第 27 章 KNN 演算法 - 鳶尾花/小行星撞地球 #### 27-2 電影推薦/ 足球射門 - 分類應用 ##### 27-4-1 認識鳶尾花數據集 鳶尾花數據集包含 4 個自變數,1 個目標變數。 鳶尾花的類別為目標變數,也稱作是標籤。 0:setosa(山鳶尾花) 1:versicolor(變色鳶尾) 2:virginica(維吉尼亞鳶尾花) ![image](https://hackmd.io/_uploads/B1OnDDJIp.png) ![image](https://hackmd.io/_uploads/S1PTww1Ip.png) #### 27-5 小行星撞地球 – 分類應用 ##### 27-5-1 認識 NASA Asteroids Classification NASA Asteroids Classification 數據集有 40 個特徵欄位。 ![image](https://hackmd.io/_uploads/SyLjE_ZUp.png) ### 第 28 章 支援向量機 - 鳶尾花/乳癌/汽車燃料 #### 28-6 乳癌數據 - 分類應用 ##### 28-6-1 認識數據 認識乳癌數據,輸出數據外型、前 5 筆數據、特徵名稱和目標標籤 ![image](https://hackmd.io/_uploads/Bkh3ajZ86.png) #### 28-8 汽車燃耗效率數據集 - 迴歸分析 ##### 28-8-1 認識汽車燃耗效率數據集 讀取 auto-mpg.csv,同時輸出前 5 筆數據 ![image](https://hackmd.io/_uploads/BJl3pMhW8a.png) ### 第 29 章 單純貝式分類 - 垃圾郵件/新聞分類/電影評論 #### 29-4 垃圾郵件分類 – Spambase 數據集 ##### 29-4-1 認識垃圾郵件數據集 Spambase 根據電子郵件的各種屬性來設計的,主要可以分為三類: * 頻率特徵 * 長度特徵 * 計數特徵 認識 spambase.csv 檔案 ![image](https://hackmd.io/_uploads/S1l_7T-Ua.png) ![image](https://hackmd.io/_uploads/H18KXp-Ua.png) ![image](https://hackmd.io/_uploads/ByW5Q6-LT.png) #### 29-8 今日頭條數據集 ##### 29-8-1 認識數據集 簡單讀取數據和輸出第一條數據 ![image](https://hackmd.io/_uploads/BJau2TbLa.png) ### 第 30 章 集成機器學習 - 蘑菇/醫療保險/玻璃/加州房價 #### 30-2 集成學習 - 投票法Voting (鳶尾花/波士頓房價) #### 30-3 集成學習 - 裝袋法Bagging (蘑菇/醫療保險) ##### 30-3-2 蘑菇數據分類應用 認識蘑菇數據集的 mushrooms.csv 檔案 ![image](https://hackmd.io/_uploads/ryiSukfIa.png) ![image](https://hackmd.io/_uploads/r1YId1f8p.png) ![image](https://hackmd.io/_uploads/BJfw_kMLT.png) ##### 30-3-4 醫療保險數據迴歸應用 認識醫療保險數據集的 insurance.csv 檔案 ![image](https://hackmd.io/_uploads/rJUbF1fUT.png) #### 30-5 集成學習 - 提升法Gradient Boosting(玻璃/加州房價) ##### 30-5-2 玻璃數據集分類的應用 玻璃數據集目標變數是 Type 玻璃的類型,它是一個整數值,範圍從 1 到 7。 每種數字代表一種玻璃類型: * 1:建築物窗戶玻璃的非浮製品 * 2:建築物窗物玻璃的浮製品 * 3:車輛窗戶玻璃的非浮製品 * 4:車輛窗戶玻璃的浮製品 * 5:容器 * 6:餐具 * 7:頭燈 認識玻璃數據集的 glass.csv 檔案 ![image](https://hackmd.io/_uploads/HyyjYxfIa.png) ![image](https://hackmd.io/_uploads/r1PiKgz8p.png) ### 第 31 章 K-means 分群 - 購物中心消費/葡萄酒評價 #### 31-6 消費分析 - 購物中心客戶消費數據 ##### 31-6-1 認識 Mall Customer Segmentation Data 認識購物中心消費數據集 ![image](https://hackmd.io/_uploads/Bke_pf78p.png) #### 31-7 價格 vs 評價 - 葡萄酒Wine Reviews ##### 31-7-1 認識 Wine Reviews 數據 認識 Wine Reviews 數據集 ![image](https://hackmd.io/_uploads/SJXO0GmUp.png) ![image](https://hackmd.io/_uploads/rJfFRzQUa.png) ### 第 32 章 PCA 主成份分析 - 手寫數字/人臉數據 #### 32-3 數字辨識 - 手寫數字digits dataset ##### 32-3-1 認識手寫數字數據集 digits dataset 認識手寫數字數據集,輸出前 5 筆數據和對應的目標變數,然後輸出數據描述。 ![image](https://hackmd.io/_uploads/B1Cb2N786.png) ![image](https://hackmd.io/_uploads/HJqQ2N7LT.png) 使用 5x2 的方式輸出前 10 個手寫數字數據集的資料 ![Figure_32-5](https://hackmd.io/_uploads/BySOh4m8a.png) ### 第 33 章 階層式分層 - 小麥樹據/老實泉 #### 33-3 小麥數據集 Seeds dataset ##### 33-3-1 認識數據集 Seeds dataset #### 33-4 老實泉數據Old Faithful Geyser Data ##### 33-4-1 認識老實泉數據集 --- ## 輸出數據集 ### 第 23 章 線性迴歸 - 波士頓房價 #### 23-3-2 波士頓房價數據集 ``` 自變數 樣本外形 : (506, 13) 目標變數樣本外形 : (506,) 特徵值名稱 ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO' 'B' 'LSTAT'] 自變數 特徵值 [[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00 6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02 4.9800e+00] [2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00 7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02 9.1400e+00] [2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00 6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02 4.0300e+00]] 目標變數 房價 [24. 21.6 34.7] 描述特徵值名稱 .. _boston_dataset: Boston house prices dataset --------------------------- **Data Set Characteristics:** :Number of Instances: 506 :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target. :Attribute Information (in order): - CRIM per capita crime rate by town - ZN proportion of residential land zoned for lots over 25,000 sq.ft. - INDUS proportion of non-retail business acres per town - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) - NOX nitric oxides concentration (parts per 10 million) - RM average number of rooms per dwelling - AGE proportion of owner-occupied units built prior to 1940 - DIS weighted distances to five Boston employment centres - RAD index of accessibility to radial highways - TAX full-value property-tax rate per $10,000 - PTRATIO pupil-teacher ratio by town - B 1000(Bk - 0.63)^2 where Bk is the proportion of black people by town - LSTAT % lower status of the population - MEDV Median value of owner-occupied homes in $1000's :Missing Attribute Values: None :Creator: Harrison, D. and Rubinfeld, D.L. This is a copy of UCI ML housing dataset. https://archive.ics.uci.edu/ml/machine-learning-databases/housing/ ``` --- ### 第 27 章 KNN 演算法 - 鳶尾花/小行星撞地球 #### 27-5-1 認識 NASA Asteroids Classification 讀取和輸出前 5 筆資料。 ![image](https://hackmd.io/_uploads/r1nr2_ZU6.png) ### 第 30 章 集成機器學習 - 蘑菇/醫療保險/玻璃/加州房價 #### 30-5 集成學習 - 提升法Gradient Boosting(玻璃/加州房價) ##### 30-5-4 加州房價數據集迴歸應用 讀取加州房屋數據,然後輸出前 5 筆數據,統計資訊和繪製值方圖。 ![image](https://hackmd.io/_uploads/HyHxoef8T.png) ![Figure_30-14](https://hackmd.io/_uploads/SJbbjlMI6.png) --- ## 預處理數據 ### 第 23 章 線性迴歸 - 波士頓房價 #### 23-4 用 Pandas 顯示與預處理數據 ##### 23-4-1 用 Pandas 顯示波士頓房價數據 ch23_5:將資料轉成 Pandas,然後顯示前 5 筆資料 ![image](https://hackmd.io/_uploads/SkLqIyHSa.png) ch23_6:擴充設計 ch23_5.py,增加顯示所有欄位 ![image](https://hackmd.io/_uploads/HJYAUJBBa.png) ch23_7:增加設定在同一行顯示所有的欄位 ![image](https://hackmd.io/_uploads/Hk0XPJHSp.png) ##### 23-4-2 將房價加入 DataFrame ch23_8:將目標欄位的房價加入 DataFrame ![image](https://hackmd.io/_uploads/SyVFvJSBa.png) ##### 23-4-3 數據清洗 ch23_9:使用 pd.info() 顯示所有欄位資料類型 ![image](https://hackmd.io/_uploads/SkGADyHrp.png) ch23_10:使用 isnull() 檢查是否存在缺失值 ![image](https://hackmd.io/_uploads/H1OW_JrB6.png) ### 第 24 章 邏輯迴歸 - 信用卡/葡萄酒/糖尿病 #### 24-6 糖尿病數據 ##### 24-6-2 缺失值檢查與處理 ch24_10.py 檢查是否有缺失值。 ![image](https://hackmd.io/_uploads/rJCRqUdrp.png) ch24_11.py 用中位數填補缺失值,同時執行結果存入 diabetes_new.csv 檔案內。 ![image](https://hackmd.io/_uploads/BJqkjcZbR.png) ##### 24-6-3 用直方圖了解特徵分佈 ch24_12.py 列出血糖分佈的直方圖。 ![Figure_24-12](https://hackmd.io/_uploads/SyVK6LOST.png) ch24_12_1.py 用直方圖繪製所有特製的分佈圖。 ![Figure_24-12-1](https://hackmd.io/_uploads/HyFa6IuBa.png) ![Figure_24-13](https://hackmd.io/_uploads/rJMf0LuH6.png) --- ### 第 25 章 決策樹 - 葡萄酒/鐵達尼號/Telco/Retail #### 25-3 葡萄酒數據 - 分類應用 ##### 25-3-1 預設條件處理葡萄酒數據 ch25_2.py 使用預設決策樹處理葡萄酒分類,輸出訓練數據和測試數據的精確度。 ![image](https://hackmd.io/_uploads/rySAZfqr6.png) #### 25-5 Telco 電信公司 - 分類應用 ##### 25-5-1 認識 UCI_Credit_Card.csv 數據 ch25_9.py 執行數據預處理,同時刪除缺失值。 ![image](https://hackmd.io/_uploads/H1HBKz9rT.png) ### 第 26 章 隨機森林樹 - 波士頓房價/鐵達尼號/Telco/收入分析 #### 26-5 美國成年人收入分析 – 分類應用 ##### 26-5-1 認識 adult.csv 數據 收入 income 是目標變數 ch26_5.py 認識與預處理 adult.csv 數據 ![image](https://hackmd.io/_uploads/Bknpj32B6.png) ### 第 27 章 KNN 演算法 - 鳶尾花/小行星撞地球 #### 27-2 電影推薦/ 足球射門 - 分類應用 ##### 27-4-2 輸出數據集 ch27_9.py 了解鳶尾花樣本外型,特徵值名稱和描述特徵值 ![image](https://hackmd.io/_uploads/B1OnDDJIp.png) ![image](https://hackmd.io/_uploads/S1PTww1Ip.png) ##### 27-4-3 用 Pandas 顯示鳶尾花數據 ch27_10.py 將鳶尾花資料轉成 Pandas,然後顯示前 5 筆資料。 ![image](https://hackmd.io/_uploads/Hy_kuwkIa.png) ##### 27-4-4 映射標籤 ![image](https://hackmd.io/_uploads/ryAeuvy8p.png) ![image](https://hackmd.io/_uploads/B1Yfuwy8T.png) #### 27-5 小行星撞地球 – 分類應用 ##### 27-5-2 數據預處理 執行數據預處理,然後輸出前 5 筆資料 ![image](https://hackmd.io/_uploads/r1nr2_ZU6.png) --- ## 特徵選擇 ### 第 23 章 線性迴歸 - 波士頓房價 #### 23-5 特徵選擇 ch23_11:顯示個欄位間的皮爾遜相關係數 ![image](https://hackmd.io/_uploads/H1tUOJrSa.png) ch23_12:使用程式挑選相關係數最有關的 2 個特徵 ![image](https://hackmd.io/_uploads/ByIo_ySrT.png) #### 23-6 使用最相關的特徵做房價預估 ##### 23-6-1 繪製離點圖 ch23_13:繪製「低收入比例 vs 房價」與「房間數 vs 房價」的散點圖。 ![Figure_23-13](https://hackmd.io/_uploads/SJUifgSrT.png) ch23_14:使用「低收入比例」、「房間數」、「房價」繪製3D散點圖。 ![Figure_23-14](https://hackmd.io/_uploads/B1ZX7lBBa.png) ##### 23-6-2 建立模型獲得 R 平方判定係數、截距與係數 ch23_15:使用 80% 的訓練數據,20% 測試數據,建立模型獲得截距與係數,同時使用 R 平方判定係數評估模型性能。 ![image](https://hackmd.io/_uploads/BkmcXxHS6.png) ch23_15_1:將兩個一維陣列組成二維陣列 ``` [[1 4] [2 5] [3 6]] ``` ##### 23-6-3 計算預估房價 ch23_16:設計輸入低收入比例和房間數,然後使用迴歸模型和迴歸公式計算預估房價。 ``` 請輸入低收入比例 : 4.98 請輸入房間數 : 6 用儲存模式 - 預估房價是 : 26.44 用迴歸公式 - 預估房價是 : 26.44 ``` ##### 23-6-4 繪製實際房價與預估房價 ch23_17:繪製「實際房價 vs 預估房價」圖表。 ![Figure_23-17](https://hackmd.io/_uploads/BJJp4grr6.png) ![image](https://hackmd.io/_uploads/BkJkrlrS6.png) ##### 23-6-5 繪製 3D 的實際房價與預估房價 ch23_18:用 3D 散點圖繪製實際房價,用 3D 平面圖繪製預估房價。 ![Figure_23-18](https://hackmd.io/_uploads/r1uOrlBHa.png) #### 23-7 多項式迴歸 ##### 23-7-1 繪製散點圖和迴歸直線 ch23_19:使用繪製 data23_19.csv 檔案的散點圖、迴歸直線,同時輸入 R 平方判定係數 ![Figure_23-19](https://hackmd.io/_uploads/HJQmIxSrT.png) ##### 23-7-2 多項式迴歸公式 [多項式回歸](https://zh.wikipedia.org/wiki/%E5%A4%9A%E9%A1%B9%E5%BC%8F%E5%9B%9E%E5%BD%92) ##### 23-7-3 生成一元二次迴歸公式的多個特徵項目 ch23_20:生成一元二次多項式的特徵值 ``` ['1' 'x' 'x^2'] [[ 1. 1. 1.] [ 1. 2. 4.] [ 1. 3. 9.] [ 1. 4. 16.]] ``` ch23_21:生成 data23_19.csv 數據的一元二次多項式的欄位名稱和特徵值。 ``` ['1' 'x' 'x^2'] [[ 1. 1. 1.] [ 1. 2. 4.] [ 1. 3. 9.] [ 1. 4. 16.] [ 1. 5. 25.] [ 1. 6. 36.]] ``` ##### 23-7-4 多項式特徵應用在 LinearRegression ch23_22:將多項式的特徵應用在 LinearRegression,這個程式是 ch23_19.py 的擴充,然後會輸出 R 平方判定係數、截距和一元二次多項式的係數,同時繪製散點圖、一元二次多項式點的連線和曲線。 Degree:2 ![Figure_23-22](https://hackmd.io/_uploads/rJ8ZulBB6.png) Degree:3 ![Figure_23-22_degree3](https://hackmd.io/_uploads/SJiAOxHS6.png) Degree:5 ![Figure_23-22_degree5](https://hackmd.io/_uploads/HJWkFxSHT.png) ##### 23-7-5 機器學習理想模型 理想的迴歸方程式應該具備下列條件: * 低偏差和低變異數 * 模型的可解釋性 * 適應性和靈活性 * 良好的性能指標 ##### 23-7-6 多元多項式的迴歸模型 ch23_23:使用二元二次多項式的觀念當作迴歸模型,重新設計 ch23_15.py ``` 測試數據R-squared Score:0.8217783992497054 截距 (b0) : 62.510 ['1' 'LSTAT' 'RM' 'LSTAT^2' 'LSTAT RM' 'RM^2'] 係數 (b0, b1, b2, b3, b4, b5, b6): [ 0.00000000e+00 3.28222887e-01 -1.54871817e+01 8.58456016e-03 -2.22945786e-01 1.71576436e+00] ``` ch23_24:使用二元二次多項式,重新設計 ch23_17.py,輸出實際房價與預估房價。 ![image](https://hackmd.io/_uploads/rJee5lHSa.png) ![Figure_23-24](https://hackmd.io/_uploads/HJ6m5xSBp.png) ##### 23-7-7 繪製 3D 的實際房價與預估房價 ch23_25:用 3D 散點圖繪製實際房價,用 3D 曲面圖繪製預估房價。 ![Figure_23-25](https://hackmd.io/_uploads/BkEscgHST.png) #### 23-8 用所有特徵執行波士頓房價預估 ch23_26:使用多元迴歸計算 R 平方判定係數,截距、係數,同時輸出測試的真實房價與預測的目標房價。最後,繪製實際房價與預估房價的圖表,同時繪製對角線,如果實際房價與預估房價相同,則此點將落在對角線上。 ![Figure_23-26](https://hackmd.io/_uploads/SJ1BigHSa.png) ![image](https://hackmd.io/_uploads/BkU8jeHra.png) ### 第 24 章 邏輯迴歸 - 信用卡/葡萄酒/糖尿病 ![image](https://hackmd.io/_uploads/SkgcDtb-A.png) #### 24-4 台灣信用卡持卡人數據集 ##### 24-4-2 挑選最重要的特徵 ch24_4.py 挑選最重要的特徵,同時繪製特徵長條圖。 ![image](https://hackmd.io/_uploads/BkDFLVdSp.png) ![Figure_24-4](https://hackmd.io/_uploads/H11T8V_S6.png) ##### 24-4-3 用最相關的 2 個特徵設計邏輯迴歸模型 ``` 訓練集數據準確率 Accuracy: 81.15% 測試集數據準確率 Accuracy: 81.68% ``` ##### 24-4-4 此用全部的特徵設計邏輯迴歸模型 ![Figure_24-5](https://hackmd.io/_uploads/ryl-t8dBT.png) #### 24-5 葡萄酒數據 ##### 24-5-1 認識葡萄酒數據 葡萄酒數據集包含 13 個特徵,即自變數,目標變數是葡萄酒的類別。 葡萄酒的類別,具體對應的品種如下: 類別 0 - Barolo(巴羅洛) 類別 1 - Grignolino(格里諾利諾) 類別 2 - Barbera(巴貝拉) ![image](https://hackmd.io/_uploads/S1DOYLuST.png) ![image](https://hackmd.io/_uploads/SyQ2tUdS6.png) ![image](https://hackmd.io/_uploads/r1JiY8_Hp.png) ##### 24-5-2 使用邏輯迴歸演算法執行葡萄酒分類 對具有 3 個類別的葡萄酒分類問題,要使用二元邏輯迴歸,可以選擇一對多策略(One-vs-Rest,OvR)。 這種方法將多類分類問題分解維多個二元分類問題。 ![image](https://hackmd.io/_uploads/BJ2CKL_ST.png) ![image](https://hackmd.io/_uploads/ryQtcIdBa.png) #### 24-6 糖尿病數據 ##### 24-6-4 用所有特徵值做糖尿病患者預估 ch24_14.py 使用邏輯迴歸,同時用所有的特徵值,設計機器學習的模型,然後預估是否有糖尿病。 ![image](https://hackmd.io/_uploads/Hy7NR8Or6.png) ##### 24-6-5 繪製皮爾遜相關係數熱圖 ch24_15.py 繪製糖尿病特徵皮爾遜相關的熱力圖。 ![Figure_24-15](https://hackmd.io/_uploads/B1ZuMPdBp.png) ##### 24-6-6 用最相關的皮爾遜係數做糖尿病預估 ch24_16.py 使用最相關的 2 個皮爾遜相關係數做糖尿病的預估。 ![image](https://hackmd.io/_uploads/H1dqGwOrT.png) ### 第 25 章 決策樹 - 葡萄酒/鐵達尼號/Telco/Retail #### 25-3 葡萄酒數據 - 分類應用 ##### 25-3-2 進一步認識決策樹深度 ch25_3.py 使用葡萄酒前 2 個特徵,然後設定 max_depth=1 和 3,同時觀察執行結果。 ![image](https://hackmd.io/_uploads/B1zWMGqBp.png) ![image](https://hackmd.io/_uploads/rkUEfMqS6.png) #### 25-5 Telco 電信公司 - 分類應用 ##### 25-5-2 決策樹數據分析 ch25_10.py 使用所有特徵,應用決策樹演算法,設計客戶是否流失的機器學習模型。 ![image](https://hackmd.io/_uploads/BJlDtzqBT.png) ![image](https://hackmd.io/_uploads/BysFYz5B6.png) ##### 25-5-3 了解特徵對模型的重要性 ch25_11.py 使用長條圖了解特徵對模型的重要性。 ![Figure_25-11](https://hackmd.io/_uploads/HkcgG79Ba.png) ![image](https://hackmd.io/_uploads/B1OZM79Hp.png) ch25_12.py 使用前 5 個重要特徵與決策樹,重新設計機器學習的模型。 ![image](https://hackmd.io/_uploads/ryHLGm5Sa.png) ![image](https://hackmd.io/_uploads/H18HQ45B6.png) ### 第 26 章 隨機森林樹 - 波士頓房價/鐵達尼號/Telco/收入分析 #### 26-5 美國成年人收入分析 – 分類應用 ##### 26-5-1 認識 adult.csv 數據 認識與預處理 adult.csv 數據 ![image](https://hackmd.io/_uploads/Bknpj32B6.png) ##### 26-5-2 使用決策樹處理年收入預估 使用決策樹演算法,用全部的特徵,將數據分類,最後輸預測準確性。 ``` 決策樹 Accuracy : 0.807 ``` ##### 26-5-3 決策樹特徵重要性 依特徵順序輸出重要性,同時用長條圖由大到小方式排序特徵。 ![Figure_26-7](https://hackmd.io/_uploads/rJ3OhhnH6.png) ![image](https://hackmd.io/_uploads/SkO_2n2B6.png) ![Figure_26-7-1](https://hackmd.io/_uploads/ByZkp23Hp.png) 應用決策樹演算法,使用 7 個重要特徵,最後輸出預測的準確度。 ``` 7個特徵決策樹 Accuracy : 0.797 ``` ### 第 30 章 集成機器學習 - 蘑菇/醫療保險/玻璃/加州房價 #### 30-3 集成學習 - 裝袋法Bagging (蘑菇/醫療保險) ##### 30-3-4 醫療保險數據迴歸應用 視覺化 insurance.csv 數據,分別顯示直方圖、特徵間的關係圖和熱力圖 ![Figure_30-1](https://hackmd.io/_uploads/H1voFyGIa.png) ![Figure_30-1-1](https://hackmd.io/_uploads/BkQoFkfIa.png) #### 30-5 集成學習 - 提升法Gradient Boosting(玻璃/加州房價) ##### 30-5-4 加州房價數據集迴歸應用 讀取加州房屋數據,然後輸出前 5 筆數據,統計資訊和繪製值方圖。 ![image](https://hackmd.io/_uploads/HyHxoef8T.png) ![Figure_30-14](https://hackmd.io/_uploads/SJbbjlMI6.png) ### 第 31 章 K-means 分群 - 購物中心消費/葡萄酒評價 #### 31-6 消費分析 - 購物中心客戶消費數據 ##### 31-6-2 收入與消費分群 ### 第 33 章 階層式分層 - 小麥樹據/老實泉 #### 33-3 小麥數據集 Seeds dataset ##### 33-3-1 認識數據集 Seeds dataset 讀取 seeds_dataset.txt 數據集並進行初步的觀察。 ![Figure_33-5](https://hackmd.io/_uploads/BkP0AIXIT.png) ![Figure_33-5-1](https://hackmd.io/_uploads/rkgWkPQUp.png) --- ## 模型應用 ### 第 25 章 決策樹 - 葡萄酒/鐵達尼號/Telco/Retail #### 25-6 Retail Data Analytics - 迴歸應用 ##### 25-6-1 用簡單的數據預估房價 ch25_14.py 用簡單的數據預估房價。 ![image](https://hackmd.io/_uploads/Hydo7E9Ba.png) ##### 25-6-2 Retail Data Analytics 數據 使用決策樹決策樹演算法估計週銷,由於這個數據集有 3 個檔案,所以程式開始是分別讀取3個檔案,然後合併。最後程式會用 Weekly_Sales 欄位當作目標變數,未來預估的銷量就是和這個欄位的銷量做比較。 ![image](https://hackmd.io/_uploads/SJBFV4cS6.png) ### 第 26 章 隨機森林樹 - 波士頓房價/鐵達尼號/Telco/收入分析 #### 26-2 波士頓房價 - 迴歸應用 ch26_1.py 簡單數據集執行隨機森林樹的應用 ``` 預測結果: [10.46 12.56 14.4 ] ``` ch26_2.py 使用隨機森林樹重新設計,設計波士頓房價的機器模型,同時輸出 R 平方判定係數 ``` R-squared : 0.913 Mean Squared Error : 8.581 ``` #### 26-3 鐵達尼號 – 分類應用 ch26_3.py 使用隨機森林樹重新設計,鐵達尼號生存預測程式。 ![image](https://hackmd.io/_uploads/BkYGi2nST.png) #### 26-4 Telco 客戶流失 – 分類應用 ch26_4.py 使用隨機森林樹重新設計,預測 Telco 客戶是否流失的程式。 ![image](https://hackmd.io/_uploads/SkwNohhBa.png) #### 26-5 美國成年人收入分析 – 分類應用 ##### 26-5-4 使用隨機森林樹處理 adult.csv 檔案 使用隨機森林樹演算法,重新設計。 ``` 隨機森林樹 Accuracy : 0.857 ``` ### 第 27 章 KNN 演算法 - 鳶尾花/小行星撞地球 #### 27-5-3 預測小行星撞地球的準確率 使用 KNN 演算法,設定 k=5,預測小行星撞地球的準確率。 ![image](https://hackmd.io/_uploads/SJ9UNFZUa.png) ### 第 28 章 支援向量機 - 鳶尾花/乳癌/汽車燃料 #### 28-5 鳶尾花數據 - 分類應用 使用向量機的 SVC 方法。 ![Figure_28-13](https://hackmd.io/_uploads/BJFE9obL6.png) 將花萼長(sepal lenght)和花萼寬(sepal width)的數據改為花瓣長(petal length)與花瓣寬(petal width)。 ![Figure_28-14](https://hackmd.io/_uploads/ByqRqo-8p.png) 使用的 linear、rbf、poly 核函數應用在鳶尾花數據,同時使用所有特徵,採用 80% 訓練數據、20% 測試數據,最後輸出準確度。 ![image](https://hackmd.io/_uploads/SkttojbU6.png) #### 28-6 乳癌數據 - 分類應用 ##### 28-6-2 線性支援向量機預測乳癌數據 使用支援向量機 SVC() 方法處理乳癌數據,輸出準確率(Accuracy)、分類報告(Classification Report),同時輸出測試的真實目標數據與預測的目標數據。 ![image](https://hackmd.io/_uploads/HkX5CiWUp.png) ##### 28-6-3 不同核函數應用在乳癌數據 使用 linear、rbf、poly 了解不同核函數應用在乳癌數據的分析。 ![image](https://hackmd.io/_uploads/BJMxJ3-86.png) #### 28-8 汽車燃耗效率數據集 - 迴歸分析 ##### 28-8-2 使用 SVR()預測汽車燃料數據 使用 linear 和 rbf 核函數預測汽車燃料的績效。 ![image](https://hackmd.io/_uploads/B1QfQnbUp.png) ### 第 29 章 單純貝式分類 - 垃圾郵件/新聞分類/電影評論 #### 29-4 垃圾郵件分類 – Spambase 數據集 ### 29-4-2 垃圾郵件分類預測 使用 MultinomialNB 模組,執行垃圾郵件 spambase 數據集的分類預測 ``` 準確度: 0.7861020629750272 ``` 使用 KNN 演算法,執行垃圾分類預測 ``` 準確度: 0.7904451682953312 ``` ### 第 29 章 單純貝式分類 - 垃圾郵件/新聞分類/電影評論 #### 29-8 今日頭條數據集 ##### 29-8-2 今日頭條數據集實作 讀取今日頭條數據集,執行預測,列出預測的準確度和分類報告。同時輸入 2 條新聞做測試,輸出分類結果 ![image](https://hackmd.io/_uploads/Hkf-CTbUp.png) ### 第 30 章 集成機器學習 - 蘑菇/醫療保險/玻璃/加州房價 #### 30-2 集成學習 - 投票法Voting (鳶尾花/波士頓房價) ### 30-2-1 投票法 - 分類應用 * 硬投票 * 軟投票 結合決策樹、KNN、支援向量機演算法的集成學習 - 投票法。 ``` 訓練資料集準確度 : 0.9916666666666667 測試資料集準確度 : 1.0 ``` ### 30-2-2 投票法 - 迴歸應用 結合決策樹迴歸、KNN 迴歸、支援向量機迴歸,演算法的集成學習 - 投票法。 ``` 訓練數據的 R 平方係數 : 0.7805780692664857 測試數據的 R 平方係數 : 0.7285033702925392 ``` #### 30-3 集成學習 - 裝袋法Bagging (蘑菇/醫療保險) ##### 30-3-2 蘑菇數據分類應用 使用裝袋法(Bagging) 預測蘑菇是否有毒,同時輸出訓練數據和測試數據的準確度。 ![image](https://hackmd.io/_uploads/BkenOyfIa.png) ##### 30-3-4 醫療保險數據迴歸應用 使用裝袋法,預測 insurance.csv 的醫療費用。 ``` 訓練數據 R 平方係數 : 0.9644144765902612 測試數據 R 平方係數 : 0.8504924418405735 ``` 使用 LinearRegressor() 當作基礎分類器的模型,再套用在 BaggingRegressor(),同時觀察執行結果。 ``` 訓練數據 R 平方係數 : 0.7415397289489185 測試數據 R 平方係數 : 0.7835835208994382 ``` #### 30-4 集成學習 - 提升法AdaBoost(糖尿病/波士頓房價) ##### 30-4-1 AdaBoost 提升法 - 分類應用語法說明 透過迭代地訓練弱分類器,弱學習器預設是決策樹,並在每次迭代中調整訓練實例的權重,使模型能夠更加關注那些被錯誤分類的實例,從而提高模型的分類性能。 ``` 訓練數據的準確度 : 0.82410 測試數據的準確度 : 0.81818 ``` ##### 30-4-2 AdaBoost 提升法 - 迴歸應用語法說明 建立在多個弱學習器,預設是決策樹,並嘗試將它們組合成一個單一的強學習器。 它可以自動進行特徵選擇,這在處理包含大量特徵的數據集時非常有用。 ``` 訓練集的R平方係數 : 0.9000767499743617 測試集的R平方係數 : 0.8508888667970742 ``` #### 30-5 集成學習 - 提升法Gradient Boosting(玻璃/加州房價) ##### 30-5-2 玻璃數據集分類的應用 使用 GradientBoostingClassifier() 預測玻璃的分類,同時輸出訓練數據和測試數據的準確度 ![image](https://hackmd.io/_uploads/SkxZqxMLT.png) --- ## 驗證 ### 第 25 章 決策樹 - 葡萄酒/鐵達尼號/Telco/Retail #### 25-5 Telco 電信公司 - 分類應用 交叉驗證(Cross-validation)是一種統計學上的模型驗證技術,用於評估機器學習模型在獨立數據集上的性能。 它主要用於檢查模型是否過度擬合(overfitting)訓練數據,並驗證模型對未見過數據的泛化能力。 交叉驗證的基本概念是將原始數據集分成兩個部分,即訓練集和測試集。訓練集用於訓練模型,測試集用於驗證模型的預測效果。 k-折交叉驗證(k-fold cross-validation)。 ![image](https://hackmd.io/_uploads/B17_QEcST.png) ![image](https://hackmd.io/_uploads/rJ79QE9Ba.png) --- # ## 數據清洗 ### 23-4-3 ch23_9:使用 pf.info() 顯示所有欄位資料類型 ``` # 加載波士頓房價數據集 boston = datasets.load_boston() df = pd.DataFrame(boston.data, columns=boston.feature_names) df['MEDV'] = boston.target # 加上目標欄位的房價欄位 print(df.info()) ``` ch23_10:使用 isnull() 檢查是否存在缺失值 ``` # 加載波士頓房價數據集 boston = datasets.load_boston() df = pd.DataFrame(boston.data, columns=boston.feature_names) df['MEDV'] = boston.target # 加上目標欄位的房價欄位 print(df.isnull().sum()) ``` ## 缺失值檢查與處理 ### 24-6-2 ch24_10:檢查是否存在缺失值 ``` # 讀取糖尿病數據集 df = pd.read_csv('diabetes.csv') # 檢查是否有缺失值 print(df.isnull().sum()) ``` ## 數據預處理 ### 27-5-2 ch27_20: 執行數據預處理,然後輸出前 5 筆資料 ``` # 讀取數據 df = pd.read_csv('nasa.csv') # 刪除指定的列 df = df.drop(['Name', 'Neo Reference ID', 'Est Dia in M(min)', 'Est Dia in M(max)', 'Est Dia in Miles(min)', 'Est Dia in Miles(max)', 'Est Dia in Feet(min)', 'Est Dia in Feet(max)', 'Epoch Date Close Approach', 'Relative Velocity km per hr', 'Miles per hour', 'Miss Dist.(Astronomical)', 'Miss Dist.(lunar)', 'Miss Dist.(miles)', 'Equinox'], axis=1) # 將 'Hazardous' 列的 True/False 轉換為 1/0 df['Hazardous'] = df['Hazardous'].map({True: 1, False: 0}) # 將 'Close Approach Date' 和 'Orbit Determination Date' # 轉換為日期時間物件,然後再轉換為時間戳記 df['Close Approach Date'] = pd.to_datetime(df['Close Approach Date'], format='%Y-%m-%d').view('int64') // 10**9 df['Orbit Determination Date'] = pd.to_datetime(df['Orbit Determination Date']).\ view('int64') // 10**9 pd.set_option('display.max_columns', None) # 顯示所有欄位 pd.set_option('display.width', 200) # 設定顯示寬度 # 顯示前五筆數據以驗證轉換是否成功 print(df.head()) ```