在进行线索转化精细化操作前,我们需要搭建Python数据分析环境。本指南使用Pandas进行数据处理,Scikit-learn进行机器学习建模,Joblib进行模型保存。请直接在终端执行以下命令安装核心依赖库:
```bash pip install pandas scikit-learn numpy joblib ```安装完成后,我们需要导入必要的模块。为了保证代码的健壮性,我们将忽略警告信息,并设置随机种子以确保结果可复现。
```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import LabelEncoder from sklearn.metrics import classification_report, accuracy_score import joblib import warnings warnings.filterwarnings('ignore') np.random.seed(42) ```数据是模型的基础。在实际业务中,数据通常来自CRM或数据库。为了确保你能直接运行代码,这里我们构建一份模拟的原始线索数据集。如果你有真实数据,请直接使用 pd.read_csv('data.csv') 替换下方的数据生成代码。
```python 构建模拟数据集 data = { 'user_id': range(1001, 1101), 'source': ['SEO', 'SEM', 'Referral', 'Direct', 'Social'] 20, 'industry': ['IT', 'Finance', 'Retail', 'IT', 'Finance'] 20, 'visit_count': np.random.randint(1, 50, 100), 'page_depth': [np.random.randint(1, 10) if np.random.random() > 0.1 else None for _ in range(100)], 'is_mobile': [True, False] 50, 'status': ['Potential', 'Converted', 'Lost', 'Potential', 'Converted'] 20 } df = pd.DataFrame(data) ```原始数据往往包含缺失值和异常值。如果直接输入模型,会导致报错或精度下降。我们需要执行以下清洗步骤:去重、缺失值填充、异常值截断。
```python 1. 去重:基于user_id去除重复线索 df.drop_duplicates(subset=['user_id'], keep='first', inplace=True) 2. 缺失值填充:页面深度缺失值通常意味着未深入浏览,填充为0 df['page_depth'].fillna(0, inplace=True) 3. 异常值处理:访问次数超过30次的视为30次,防止极值拉偏模型 df['visit_count'] = df['visit_count'].apply(lambda x: min(x, 30)) 4. 数据类型转换:确保数值列为int类型 df['page_depth'] = df['page_depth'].astype(int) ```模型无法直接理解文本数据,我们需要将“来源”、“行业”等分类特征转换为数值。同时,需要明确目标变量。我们将 status 列作为标签,将“Converted”(已转化)标记为1,其他状态标记为0。
```python 1. 标签构建:将已转化标记为1,其他为0 df['label'] = df['status'].apply(lambda x: 1 if x == 'Converted' else 0) 2. 特征编码:使用LabelEncoder将文本分类特征转为数值 注意:实际生产中建议使用OneHotEncoder,这里为简化实操使用LabelEncoder le_source = LabelEncoder() le_industry = LabelEncoder() df['source_encoded'] = le_source.fit_transform(df['source']) df['industry_encoded'] = le_industry.fit_transform(df['industry']) df['is_mobile_encoded'] = df['is_mobile'].astype(int) 3. 特征选择:挑选对转化有影响的特征列 feature_cols = ['source_encoded', 'industry_encoded', 'visit_count', 'page_depth', 'is_mobile_encoded'] X = df[feature_cols] y = df['label'] ```
我们选择 随机森林 算法。该算法对数据 scaling 不敏感,且能较好地处理非线性关系,非常适合作为线索评分的基线模型。我们将数据集按 8:2 的比例切分为训练集和测试集。
```python 切分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) 初始化模型 n_estimators=100 表示使用100棵树,max_depth=5 防止过拟合 model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42) 训练模型 model.fit(X_train, y_train) 模型预测 y_pred = model.predict(X_test) 输出评估报告 print("准确率:", accuracy_score(y_test, y_pred)) print("\n详细评估报告:\n", classification_report(y_test, y_pred)) ```上述代码运行后会输出准确率、召回率等指标。如果召回率过低,说明模型漏掉了很多潜在的高价值线索,此时需要回到特征工程阶段增加更多行为特征(如“是否下载白皮书”、“咨询次数”等)。
训练好的模型核心价值在于预测概率。我们需要使用 predict_proba 接口获取每个线索转化为正例(即成交)的概率值。这个概率值就是我们需要的“线索分”。
```python 获取转化概率(即正例的概率) predict_proba返回两列,第0列是预测为0的概率,第1列是预测为1的概率 y_proba = model.predict_proba(X_test)[:, 1] 构建结果DataFrame result_df = pd.DataFrame(X_test, columns=feature_cols) result_df['user_id'] = df.loc[X_test.index, 'user_id'] 还原用户ID result_df['conversion_probability'] = y_proba result_df['original_status'] = df.loc[X_test.index, 'status'] 按照转化概率从高到低排序 result_df = result_df.sort_values(by='conversion_probability', ascending=False) 展示Top 10高价值线索 print("Top 10 高价值线索列表:") print(result_df[['user_id', 'conversion_probability', 'original_status']].head(10)) ```为了方便业务系统调用,我们需要将模型和编码器保存到本地文件。这样在预测新数据时,可以直接加载模型而无需重新训练。
```python 保存模型 joblib.dump(model, 'lead_conversion_model.pkl') joblib.dump(le_source, 'source_encoder.pkl') joblib.dump(le_industry, 'industry_encoder.pkl') print("模型及编码器已保存至本地,可进行部署。") ```当业务系统产生新线索时,我们需要加载刚才保存的模型进行实时评分。以下是一个完整的预测脚本示例,模拟了一条新线索进入系统后的处理流程。
```python 1. 加载模型和编码器 loaded_model = joblib.load('lead_conversion_model.pkl') loaded_le_source = joblib.load('source_encoder.pkl') loaded_le_industry = joblib.load('industry_encoder.pkl') 2. 模拟一条新线索数据 new_lead = pd.DataFrame({ 'source': ['SEM'], 'industry': ['Finance'], 'visit_count': [15], 'page_depth': [8], 'is_mobile': [True] }) 3. 数据预处理(必须与训练时保持一致) 处理异常值 new_lead['visit_count'] = new_lead['visit_count'].apply(lambda x: min(x, 30)) 缺失值填充 new_lead['page_depth'].fillna(0, inplace=True) 编码 try: new_lead['source_encoded'] = loaded_le_source.transform(new_lead['source']) new_lead['industry_encoded'] = loaded_le_industry.transform(new_lead['industry']) except ValueError as e: 处理训练集中未出现的新类别(赋予默认值0) print(f"警告:遇到新类别,{e}") new_lead['source_encoded'] = 0 new_lead['industry_encoded'] = 0 new_lead['is_mobile_encoded'] = new_lead['is_mobile'].astype(int) 4. 构建特征向量 X_new = new_lead[feature_cols] 5. 预测评分 score = loaded_model.predict_proba(X_new)[:, 1][0] print(f"新线索的转化概率评分为: {score:.4f}") 6. 简单的分层策略 if score > 0.7: action = "S级-立即电话跟进" elif score > 0.4: action = "A级-加入邮件培育" else: action = "B级-保持观察" print(f"建议操作策略: {action}") ```通过以上步骤,你已经完成了一套从数据清洗到模型落地,再到新数据实时预测的完整线索转化精细化流程。这套代码可以直接集成到你的数据清洗脚本或API服务中,实现自动化的线索评分。
下一篇: 校园网站安全,别让校园网变成“校园危”
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图