NumPy:數值計算的基石
NumPy是Python中用于科學計算的核心庫,它提供了一個強大的N維數組對象,以及大量的數學函數庫,能夠高效地進行向量和矩陣運算。對于數據科學家而言,掌握NumPy是進行數據處理和算法實現的基礎。
創建與操作數組
在NumPy中,ndarray
(N-dimensional array)是其核心數據結構。通過它可以方便地創建多維數組,并進行各種數學運算。例如,創建一個一維數組并執行基本運算:
import numpy as np# 創建一個一維數組
a = np.array([1, 2, 3, 4])# 數組加法
b = a + 1 # 結果: [2, 3, 4, 5]# 數組乘法
c = a * 2 # 結果: [2, 4, 6, 8]
高級索引與切片
NumPy支持多種索引方式,包括布爾索引和整數索引,這使得數據篩選和修改變得非常靈活。例如,使用布爾索引選取大于2的元素:
# 使用布爾索引選取大于2的元素
filtered_a = a[a > 2] # 結果: [3, 4]
通用函數(ufunc)
NumPy的通用函數能夠對數組中的每個元素執行快速操作,如平方根、對數等。這些函數通常是矢量化的,意味著它們可以同時作用于整個數組,而無需顯式的循環。例如,計算數組中每個元素的平方根:
# 計算平方根
sqrt_a = np.sqrt(a) # 結果: [1. 1.41421356 1.73205081 2. ]
Pandas:數據分析的強大工具
Pandas是建立在NumPy之上的一個庫,專為數據預處理、清洗、分析和可視化設計。它引入了兩種主要的數據結構:Series
(一維)和DataFrame
(二維),極大地提高了數據處理的效率和便捷性。
數據加載與初步處理
Pandas支持從多種數據源加載數據,包括CSV、Excel、SQL數據庫等。加載數據后,通常需要進行一些初步的清洗工作,如處理缺失值、轉換數據類型等。例如,從CSV文件加載數據并查看前幾行:
import pandas as pd# 從CSV文件加載數據
df = pd.read_csv('data.csv')# 查看前五行
print(df.head())
數據選擇與過濾
Pandas提供了豐富的數據選擇機制,允許用戶基于標簽、位置或條件表達式來選取數據。例如,選擇特定列的數據:
# 選擇'age'和'salary'兩列
subset = df[['age', 'salary']]
或者根據條件過濾行:
# 過濾年齡大于30的數據
filtered_df = df[df['age'] > 30]
數據聚合與分組
Pandas的groupby
功能是進行數據聚合和分組操作的強大工具。通過groupby
,可以輕松計算各組的統計量,如均值、總和等。例如,按部門計算平均薪資:
# 按'department'分組并計算平均薪資
avg_salary = df.groupby('department')['salary'].mean()
Scikit-learn:機器學習的瑞士軍刀
Scikit-learn是一個簡單高效的Python機器學習庫,它建立在NumPy、Pandas和Matplotlib之上,為數據科學家和機器學習從業者提供了豐富的算法實現和工具。無論是分類、回歸、聚類還是降維,Scikit-learn都提供了簡潔易用的接口。
數據集的準備與劃分
在使用Scikit-learn進行模型訓練之前,通常需要將數據集分為訓練集和測試集,以評估模型的性能。Scikit-learn提供了train_test_split
函數來簡化這一過程。例如,將數據集按80%訓練,20%測試的比例劃分:
from sklearn.model_selection import train_test_split# 假設X為特征,y為目標變量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
模型訓練與預測
Scikit-learn擁有眾多預定義的模型,如線性回歸、邏輯回歸、支持向量機等。以下是一個使用邏輯回歸進行二分類的示例:
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score# 初始化模型
model = LogisticRegression()# 訓練模型
model.fit(X_train, y_train)# 進行預測
y_pred = model.predict(X_test)# 評估模型準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
超參數調優與交叉驗證
為了找到模型的最佳參數,Scikit-learn提供了網格搜索(GridSearchCV)和隨機搜索(RandomizedSearchCV)等工具。這些工具通過交叉驗證的方式評估不同參數組合的效果,從而選擇出最優的參數配置。例如,使用網格搜索尋找最佳參數:
from sklearn.model_selection import GridSearchCV# 定義參數網格
param_grid = {'C': [0.1, 1, 10], 'penalty': ['l1', 'l2']}# 初始化GridSearchCV
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)# 執行搜索
grid_search.fit(X_train, y_train)# 輸出最佳參數
print(f"Best parameters: {grid_search.best_params_}")
實戰案例:從數據到模型的完整流程
為了更好地理解上述工具鏈的應用,下面通過一個具體的案例來展示如何從原始數據出發,經過處理、分析,最終構建并評估一個機器學習模型。
數據加載與清洗
假設有一個關于員工信息的CSV文件,包含員工的年齡、部門、薪資等信息。需要加載數據并進行初步的清洗工作。
import pandas as pd# 加載數據
df = pd.read_csv('employees.csv')# 查看缺失值情況
print(df.isnull().sum())# 填充缺失值(例如,用中位數填充薪資的缺失值)
df['salary'].fillna(df['salary'].median(), inplace=True)
特征工程與數據準備
接下來,需要對數據進行特征工程,包括轉換分類變量為數值型、標準化特征等,以便模型能夠處理。
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer# 定義預處理步驟:對'department'進行獨熱編碼,對'age'和'salary'進行標準化
preprocessor = ColumnTransformer(transformers=[('dept', OneHotEncoder(), ['department']),('num', StandardScaler(), ['age', 'salary'])])# 應用預處理步驟
X = preprocessor.fit_transform(df)
y = df['left'] # 假設目標變量是員工是否離職(二分類問題)
模型訓練與評估
現在,可以使用Scikit-learn中的模型進行訓練和評估。這里,選擇邏輯回歸作為示例模型。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import confusion_matrix, classification_report# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化模型
model = LogisticRegression()# 訓練模型
model.fit(X_train, y_train)# 在測試集上進行預測
y_pred = model.predict(X_test)# 評估模型性能
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print("Classification Report:")
print(classification_report(y_test, y_pred))
超參數調優與模型優化
為了進一步提高模型的性能,可以使用網格搜索來調整模型的超參數。
from sklearn.model_selection import GridSearchCV# 定義參數網格
param_grid = {'C': [0.01, 0.1, 1, 10, 100], 'penalty': ['l1', 'l2'], 'solver': ['liblinear']}# 初始化GridSearchCV
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5, scoring='accuracy')# 執行搜索
grid_search.fit(X_train, y_train)# 輸出最佳參數和最佳得分
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best cross-validation score: {grid_search.best_score_}")