微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ValueError: X 有 500000 个特征,但 ExtraTreeClassifier 期望 7 个特征作为输入

如何解决ValueError: X 有 500000 个特征,但 ExtraTreeClassifier 期望 7 个特征作为输入

我正在尝试为我使用 extratees 分类器实现的机器学习模型开发 UI。

下面的代码显示了我在训练后如何导出模型以在 UI 中使用。预测是使用 is_attributed 列完成的。

import numpy as np
import pandas as pd
from collections import Counter
import datetime
from sklearn.model_selection import train_test_split
from sklearn.model_selection import RepeatedStratifiedKFold
import gc

import warnings
warnings.simplefilter('ignore')

df = pd.read_csv('../cleaned_train.csv',index_col=0)

df['click_time'] = pd.to_datetime(df['click_time'])

df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10000000 entries,0 to 9999999
Data columns (total 9 columns):
 #   Column         Dtype         
---  ------         -----         
 0   ip             int64         
 1   app            int64         
 2   device         int64         
 3   os             int64         
 4   channel        int64         
 5   click_time     datetime64[ns]
 6   is_attributed  int64         
 7   hour           int64         
 8   day            int64         
dtypes: datetime64[ns](1),int64(8)
memory usage: 762.9 MB

X= df.drop(columns=['is_attributed','click_time'])
y= df['is_attributed']

#Undersample data
from imblearn.under_sampling import RandomUnderSampler

rus = RandomUnderSampler() 
X_res,y_res = rus.fit_resample(X,y)

X_train,X_test,y_train,y_test = train_test_split(X_res,y_res,test_size = 0.33,random_state = 0)

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.model_selection import gridsearchcv
import pickle

# ExtraTreesClassifier
ec = ExtraTreesClassifier(max_depth=None,n_estimators=50)
ec.fit(X_train,y_train)

y_predec=ec.predict(X_test)
pickle.dump(gsec,open('model.pkl','wb'))

当我尝试打印此 print(gsec.predict(X_test)) 时,我得到的结果为 [1 1 0 ... 1 1 0]

当我尝试使用 Flask 开发 UI 时出现问题。我在烧瓶中导入模型并尝试预测。下面是代码

# importing necessary libraries and functions
import numpy as np
import pandas as pd
from flask import Flask,request,jsonify,render_template,make_response
from werkzeug.utils import secure_filename
from werkzeug.datastructures import  FileStorage
import pickle
import io
from io import StringIO
import csv

app = Flask(__name__) #Initialize the flask App

@app.route('/') # Homepage
def home():
return render_template('index.html')


@app.route('/predict',methods=['GET','POST'])
def predict():
'''
For rendering results on HTML GUI
'''

# retrieving values from form
if request.method == 'POST':
  f = request.files['data_file']
  if not f:
    return "No file"

stream = io.StringIO(f.stream.read().decode("UTF8"),newline=None)
csv_input = csv.reader(stream)
# print(csv_input)
for row in csv_input:
    print(row)

stream.seek(0)
result = stream.read()

df = pd.read_csv('newcleaned_test.csv')
attribute = df['is_attributed']
ip = df['ip']

print (attribute)

# load the model from disk
loaded_model = pickle.load(open('model.pkl','rb'))
prediction = loaded_model.predict([attribute])

print (prediction)
return 'prediction'



if __name__ == "__main__":
app.run(debug=True)

尝试运行上述代码时,

ValueError: X has 500000 features,but ExtraTreeClassifier is expecting 7 features as input.

显示在我的浏览器中。 (我使用的数据文件有 7 列的 500000 数据)。当我使用一列训练模型时,为什么会抛出此错误

解决方法

你在这里有一些误解。

首先,从代码中可以看出,模型是在 7 列作为输入 [ip,app,device,os,channel,hour,day] 进行训练的。并且该模型经过训练以预测来自 is_attributed 列的值。因此,提供具有 7 个值的模型列表 -> 接收 1 个值作为输出。而这个值似乎是 0 或 1 取决于输入 7 个值。

其次,我们现在可以进入 Flask 部分。基本上,您在这里所做的是加载数据框并选择一列 (attribute = df['is_attributed'])。如果您有 50000 行的数据框并且您选择了一列,则意味着您选择了 50000 个值!然后您尝试将其发送到模型,该模型需要正好 7 个值作为输入。 从我的角度来看,您似乎希望在 test 数据帧的每一行上运行模型。

要做到这一点,您需要:

  1. 加载 test 数据帧;
  2. 检查数据框中是否只有 7 列 ([ip,day])。如果您有更多列,请删除所有其他列;
  3. 遍历数据帧中的每一行(每行总共 50000);
  4. 使用行中的 7 个值作为输入运行模型;
  5. 模型的输出附加到一个python列表;
  6. 运行 50000 次后,您将拥有包含 50000 个值的 Python 列表;
  7. 返回这个列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。