File size: 3,167 Bytes
027ce51 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# ==============================================================================
# 步骤 2: 训练并保存【基础模型 A】 (TF-IDF + 逻辑回归)
#
# 策略: (来自 DM-03 PPT 的特征工程 和 DM-01/03 PPT 的 SVM/LR)
# 1. 加载【完整】训练数据。
# 2. 训练 TF-IDF 向量器 (来自 DM-03)。
# 3. 训练逻辑回归模型,并使用 `class_weight='balanced'` 来处理不平衡问题。
# 4. 使用 joblib 将训练好的 vectorizer 和 model 保存到磁盘。
# ==============================================================================
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
import joblib
import os
import time
# --- 1. 定义路径 ---
TRAIN_FILE_PATH = "/tmp/home/wzh/file/train_data.csv"
VALID_FILE_PATH = "/tmp/home/wzh/file/val_data.csv"
MODEL_A_SAVE_DIR = "./final_model_tfidf"
VECTORIZER_PATH = os.path.join(MODEL_A_SAVE_DIR, "vectorizer.joblib")
MODEL_A_PATH = os.path.join(MODEL_A_SAVE_DIR, "model_A.joblib")
# --- 2. 创建保存目录 ---
os.makedirs(MODEL_A_SAVE_DIR, exist_ok=True)
# --- 3. 加载数据 ---
print("--- 正在训练【基础模型 A】 (TF-IDF + LR) ---")
print("加载数据...")
train_df = pd.read_csv(TRAIN_FILE_PATH)
eval_df = pd.read_csv(VALID_FILE_PATH)
label_map = {"real": 0, "fake": 1}
train_df['label'] = train_df['label'].map(label_map)
eval_df['label'] = eval_df['label'].map(label_map)
X_train_text = train_df['text']
y_train = train_df['label']
X_eval_text = eval_df['text']
y_eval = eval_df['label']
print(f"训练集大小: {len(train_df)}")
print(f"验证集大小: {len(eval_df)}")
print(f"训练集标签分布:\n{y_train.value_counts(normalize=True)}")
# --- 4. 训练 TF-IDF ---
print("\n--- 正在训练 TF-IDF Vectorizer... ---")
start_time = time.time()
# DM-03 PPT 启发:特征工程是关键。TF-IDF是短文本的基础特征。
vectorizer = TfidfVectorizer(max_features=25000, stop_words='english', ngram_range=(1, 2))
X_train_tfidf = vectorizer.fit_transform(X_train_text)
print(f"TF-IDF 训练完毕. 耗时: {time.time() - start_time:.2f} 秒")
# --- 5. 训练逻辑回归 ---
print("--- 正在训练逻辑回归 (Model A)... ---")
start_time = time.time()
# DM-01 PPT 提到了 SVM,LR 是一个类似的线性模型
# (关键) 使用 class_weight='balanced' 来自动处理不平衡问题
model_A = LogisticRegression(
class_weight='balanced',
solver='liblinear',
C=1.0,
random_state=42
)
model_A.fit(X_train_tfidf, y_train)
print(f"模型 A 训练完毕. 耗时: {time.time() - start_time:.2f} 秒")
# --- 6. 评估模型 A (可选) ---
print("\n--- 【模型 A】在验证集上的独立性能 ---")
X_eval_tfidf = vectorizer.transform(X_eval_text)
preds_A = model_A.predict(X_eval_tfidf)
print(classification_report(y_eval, preds_A, target_names=['real (0)', 'fake (1)'], digits=4))
# --- 7. 保存模型 A ---
print(f"--- 正在保存模型 A 到 {MODEL_A_SAVE_DIR} ---")
joblib.dump(vectorizer, VECTORIZER_PATH)
joblib.dump(model_A, MODEL_A_PATH)
print("模型 A (TF-IDF + LR) 保存完毕!") |