模型准确率: 0.5167030908523259 请输入薪资待遇(如5000-8000): & E:/python3.12.6/python.exe c:/Users/86136/Desktop/数据可视化/程序实现.py 请输入公司介绍: 6000 请输入城市: 南昌 请输入区域: 红谷滩 请输入街道: 无 请输入经验要求(如1-3年): 2年 请输入学历要求(如本科): 本科 请输入领域(如IT、金融等): IT 请输入公司性质(如国企、外企等): 国企 Traceback (most recent call last): File "c:\Users\86136\Desktop\数据可视化\1.py", line 73, in <module> main() File "c:\Users\86136\Desktop\数据可视化\1.py", line 69, in main prediction = model.predict(new_data)[0] ^^^^^^^^^^^^^^^^^^^^^^^ File "E:\python3.12.6\Lib\site-packages\sklearn\pipeline.py", line 786, in predict Xt = transform.transform(Xt) ^^^^^^^^^^^^^^^^^^^^^^^ File "E:\python3.12.6\Lib\site-packages\sklearn\utils\_set_output.py", line 316, in wrapped data_to_wrap = f(self, X, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\python3.12.6\Lib\site-packages\sklearn\compose\_column_transformer.py", line 1085, in transform raise ValueError(f"columns are missing: {diff}") ValueError: columns are missing: {'source_file', '岗位需求', '职位详情页', '公司详情页'}
时间: 2025-07-01 22:01:27 浏览: 13
你遇到的错误是:
```
ValueError: columns are missing: {'source_file', '岗位需求', '职位详情页', '公司详情页'}
```
这说明你在预测阶段使用的 `new_data` 数据框缺少了训练时使用的一些列字段。
---
## 🧠 错误原因分析
### ✅ 问题核心:
模型在训练时看到的特征列(X)包括这些字段:
```python
['薪资待遇', '公司介绍', '城市', '区域', '街道', '经验', '学历', '领域', '性质', 'source_file', '岗位需求', '职位详情页', '公司详情页']
```
但你在用户输入函数中只提供了:
```python
['薪资待遇', '公司介绍', '城市', '区域', '街道', '经验', '学历', '领域', '性质']
```
所以当调用 `model.predict(new_data)` 时,模型发现少了 `'source_file'`, `'岗位需求'`, `'职位详情页'`, `'公司详情页'` 这几个字段,就报错了。
---
## ✅ 解决方案
### 方案一:【推荐】在用户输入中删除多余字段(如果训练时也不需要)
如果你在训练时没有使用到 `'source_file'`, `'岗位需求'`, `'职位详情页'`, `'公司详情页'` 等字段,那么你应该从数据中删除它们,并确保训练和预测时的特征保持一致。
#### 修改代码如下:
```python
# 在 preprocess_data 函数中删除多余的列
def preprocess_data(data, target_col='职位名称'):
if target_col not in data.columns:
raise ValueError(f"目标列 '{target_col}' 不存在于CSV列中,请检查列名。")
# 删除目标列 + 不需要的列
X = data.drop(columns=[target_col, 'source_file', '岗位需求', '职位详情页', '公司详情页'])
y = data[target_col]
categorical_features = X.select_dtypes(include=['object']).columns
preprocessor = ColumnTransformer(
transformers=[
('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)],
remainder='passthrough')
return X, y, preprocessor
```
同时确保你的 `user_input()` 函数也只保留相同的字段:
```python
def user_input():
薪资待遇 = input("请输入薪资待遇(如5000-8000): ")
公司介绍 = input("请输入公司介绍: ")
城市 = input("请输入城市: ")
区域 = input("请输入区域: ")
街道 = input("请输入街道: ")
经验 = input("请输入经验要求(如1-3年): ")
学历 = input("请输入学历要求(如本科): ")
领域 = input("请输入领域(如IT、金融等): ")
性质 = input("请输入公司性质(如国企、外企等): ")
user_data = pd.DataFrame({
'薪资待遇': [薪资待遇],
'公司介绍': [公司介绍],
'城市': [城市],
'区域': [区域],
'街道': [街道],
'经验': [经验],
'学历': [学历],
'领域': [领域],
'性质': [性质]
})
return user_data
```
---
### 方案二:如果你确实需要用到这些字段(如“岗位需求”),那就必须在用户输入中加上它们
```python
def user_input():
薪资待遇 = input("请输入薪资待遇(如5000-8000): ")
公司介绍 = input("请输入公司介绍: ")
城市 = input("请输入城市: ")
区域 = input("请输入区域: ")
街道 = input("请输入街道: ")
经验 = input("请输入经验要求(如1-3年): ")
学历 = input("请输入学历要求(如本科): ")
领域 = input("请输入领域(如IT、金融等): ")
性质 = input("请输入公司性质(如国企、外企等): ")
source_file = input("请输入 source_file(文件来源): ")
岗位需求 = input("请输入岗位需求: ")
职位详情页 = input("请输入职位详情页链接: ")
公司详情页 = input("请输入公司详情页链接: ")
user_data = pd.DataFrame({
'薪资待遇': [薪资待遇],
'公司介绍': [公司介绍],
'城市': [城市],
'区域': [区域],
'街道': [街道],
'经验': [经验],
'学历': [学历],
'领域': [领域],
'性质': [性质],
'source_file': [source_file],
'岗位需求': [岗位需求],
'职位详情页': [职位详情页],
'公司详情页': [公司详情页]
})
return user_data
```
---
## ✅ 拓展建议:统一训练与预测的数据结构
为了防止类似问题再次出现,你可以:
1. **保存训练时使用的列名列表**
2. **在预测时根据这个列表筛选输入字段**
```python
# 保存训练列名
TRAINING_COLUMNS = ['薪资待遇', '公司介绍', '城市', '区域', '街道', '经验', '学历', '领域', '性质']
# 使用时过滤掉不在其中的列
def user_input():
...
user_data = pd.DataFrame({...})
return user_data[TRAINING_COLUMNS]
```
---
阅读全文
相关推荐













