以下是一個使用 `scikit-learn`(sklearn)進行機器學習的通用 Python 代碼模板。這個模板涵蓋了數據加載、預處理、模型訓練、評估和預測的基本流程,適用于常見的機器學習任務。
?
```python
# 導入必要的庫
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.ensemble import RandomForestClassifier # 以隨機森林為例,可根據任務替換模型
?
# 1. 加載數據
# 假設數據是一個 CSV 文件
data = pd.read_csv('your_dataset.csv')
?
# 2. 數據預處理
# 分離特征和目標變量
X = data.drop('target_column', axis=1) # 替換 'target_column' 為目標列名
y = data['target_column']
?
# 將數據集分為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
?
# 特征標準化(根據需求選擇)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
?
# 3. 選擇并訓練模型
model = RandomForestClassifier(random_state=42) # 以隨機森林為例,可替換為其他模型
model.fit(X_train, y_train)
?
# 4. 模型評估
# 在測試集上進行預測
y_pred = model.predict(X_test)
?
# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'模型準確率: {accuracy:.2f}')
?
# 打印分類報告
print("分類報告:")
print(classification_report(y_test, y_pred))
?
# 打印混淆矩陣
print("混淆矩陣:")
print(confusion_matrix(y_test, y_pred))
?
# 5. 模型保存(可選)
import joblib
joblib.dump(model, 'model.pkl') # 保存模型到文件
?
# 6. 加載模型并進行預測(可選)
loaded_model = joblib.load('model.pkl')
new_predictions = loaded_model.predict(X_test) # 對新數據進行預測
```
?
### 關鍵步驟說明:
1. **數據加載**:從文件(如 CSV)中加載數據。
2. **數據預處理**:
? ?- 分離特征(`X`)和目標變量(`y`)。
? ?- 將數據集分為訓練集和測試集。
? ?- 對特征進行標準化或歸一化(可選)。
3. **模型訓練**:選擇模型(如隨機森林、邏輯回歸等)并訓練。
4. **模型評估**:使用測試集評估模型性能,輸出準確率、分類報告和混淆矩陣。
5. **模型保存與加載**:將訓練好的模型保存到文件,便于后續使用。
?
### 注意事項:
- 根據任務類型(分類、回歸、聚類等)選擇合適的模型和評估指標。
- 如果數據量較大,可以使用交叉驗證(`cross_val_score`)或網格搜索(`GridSearchCV`)優化模型。
- 對于非數值型數據,需要進行編碼(如 `OneHotEncoder` 或 `LabelEncoder`)。
在機器學習中,模型選擇和調參是提升性能的關鍵步驟。Python 的 `scikit-learn` 提供了豐富的工具來實現這些任務。以下是一個完整的模型選擇和調參的流程,包括交叉驗證、網格搜索和隨機搜索。
### 1. 導入必要的庫
```python
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV, RandomizedSearchCV, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
from scipy.stats import randint
```
### 2. 加載和預處理數據
```python
# 加載數據
data = pd.read_csv('your_dataset.csv')
# 分離特征和目標變量
X = data.drop('target_column', axis=1) ?# 替換 'target_column' 為目標列名
y = data['target_column']
# 數據集劃分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 特征標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
```
### 3. 模型選擇
通過交叉驗證評估多個模型的性能,選擇最佳模型。
```python
# 示例:比較隨機森林和支持向量機
from sklearn.svm import SVC
models = {
? ? 'RandomForest': RandomForestClassifier(random_state=42),
? ? 'SVM': SVC(random_state=42)
}
# 交叉驗證評估
for name, model in models.items():
? ? scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
? ? print(f'{name} 的平均準確率: {np.mean(scores):.2f}')
```
### 4. 超參數調優
#### 4.1 網格搜索(Grid Search)
網格搜索會遍歷所有給定的參數組合,找到最優參數。
```python
# 定義參數網格
param_grid = {
? ? 'n_estimators': [50, 100, 200],
? ? 'max_depth': [None, 10, 20, 30],
? ? 'min_samples_split': [2, 5, 10]
}
# 初始化模型
model = RandomForestClassifier(random_state=42)
# 網格搜索
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 輸出最佳參數和得分
print(f'最佳參數: {grid_search.best_params_}')
print(f'最佳交叉驗證得分: {grid_search.best_score_:.2f}')
# 使用最佳模型進行預測
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
print(f'測試集準確率: {accuracy_score(y_test, y_pred):.2f}')
```
#### 4.2 隨機搜索(Random Search)
隨機搜索從參數分布中隨機采樣,適合參數空間較大的情況。
```python
# 定義參數分布
param_dist = {
? ? 'n_estimators': randint(50, 200),
? ? 'max_depth': [None, 10, 20, 30],
? ? 'min_samples_split': randint(2, 11)
}
# 隨機搜索
random_search = RandomizedSearchCV(estimator=model, param_distributions=param_dist, n_iter=10, cv=5, scoring='accuracy', random_state=42)
random_search.fit(X_train, y_train)
# 輸出最佳參數和得分
print(f'最佳參數: {random_search.best_params_}')
print(f'最佳交叉驗證得分: {random_search.best_score_:.2f}')
# 使用最佳模型進行預測
best_model = random_search.best_estimator_
y_pred = best_model.predict(X_test)
print(f'測試集準確率: {accuracy_score(y_test, y_pred):.2f}')
```
### 5. 模型評估
使用測試集評估最終模型的性能。
```python
# 打印分類報告
print("分類報告:")
print(classification_report(y_test, y_pred))
# 打印混淆矩陣
from sklearn.metrics import confusion_matrix
print("混淆矩陣:")
print(confusion_matrix(y_test, y_pred))
```
### 6. 保存模型
將訓練好的模型保存到文件,便于后續使用。
```python
import joblib
joblib.dump(best_model, 'best_model.pkl')
```
### 總結
- **模型選擇**:通過交叉驗證比較多個模型的性能。
- **調參方法**:
? - 網格搜索(`GridSearchCV`):適合小規模參數空間。
? - 隨機搜索(`RandomizedSearchCV`):適合大規模參數空間。
- **模型評估**:使用測試集評估模型性能,輸出分類報告和混淆矩陣。
- **模型保存**:將最佳模型保存到文件。
通過以上步驟,可以系統地選擇和優化機器學習模型。