# predict.py - 客户流失预测接口 import joblib import pandas as pd # 加载保存好的模型(关键:路径要和save_model.py生成的pkl文件一致) try: model = joblib.load('telco_churn_model.pkl') print("✅ 模型加载成功!") except FileNotFoundError: print("❌ 未找到模型文件,请先运行save_model.py生成telco_churn_model.pkl") exit() def predict_churn(customer_data): """ 预测客户流失概率 参数:customer_data - DataFrame,包含客户的所有特征 返回:预测结果(是否流失+流失概率) """ # 新增特征组合(必须和训练时一致,否则预测不准) customer_data['tenure_monthly'] = customer_data['tenure'] * customer_data['MonthlyCharges'] customer_data['tenure_ratio'] = customer_data['tenure'] / (customer_data['TotalCharges'] + 1) customer_data['monthly_total_ratio'] = customer_data['MonthlyCharges'] / (customer_data['TotalCharges'] + 1) # 执行预测 churn_pred = model.predict(customer_data) # 0=未流失,1=流失 churn_prob = model.predict_proba(customer_data)[:, 1] # 流失概率 # 整理结果 result = pd.DataFrame({ '客户ID': customer_data['customerID'], '是否流失(0=否,1=是)': churn_pred, '流失概率': churn_prob.round(3) # 保留3位小数 }) return result # 示例:预测1个测试客户的流失概率 if __name__ == "__main__": # 构造测试客户数据(特征和原数据集一致) test_customer = pd.DataFrame({ 'customerID': ['TEST001'], # 客户ID 'tenure': [12], # 在网时长(月) 'MonthlyCharges': [69.99], # 月消费 'TotalCharges': [839.88], # 总消费 'Contract': ['Month-to-month'], # 合同类型(月付) 'InternetService': ['Fiber optic'], # 光纤上网 'PaymentMethod': ['Electronic check'], # 电子支票支付 'OnlineSecurity': ['No'], # 无网络安全服务 'TechSupport': ['No'], # 无技术支持 'PaperlessBilling': ['Yes'], # 无纸化账单 # 以下是其他必填特征(按原数据集补充) 'gender': ['Female'], 'SeniorCitizen': [0], 'Partner': ['Yes'], 'Dependents': ['No'], 'PhoneService': ['Yes'], 'MultipleLines': ['No'], 'OnlineBackup': ['Yes'], 'DeviceProtection': ['No'], 'StreamingTV': ['Yes'], 'StreamingMovies': ['No'] }) # 调用预测函数 result = predict_churn(test_customer) # 打印结果 print("\n📊 客户流失预测结果:") print(result)