ValueError:X 每个样本有 231 个特征;期待 1228

Posted

技术标签:

【中文标题】ValueError:X 每个样本有 231 个特征;期待 1228【英文标题】:ValueError: X has 231 features per sample; expecting 1228 【发布时间】:2020-05-21 04:04:42 【问题描述】:

这是训练模型的脚本的顶部(我使用的是逻辑回归):

data_raw = pd.read_sql(sql,cnxn)

pd.Series(data_raw.columns) 
pd.Series(data_raw.dtypes)

data_raw.describe(include='all')

data_raw['collision_type'] = data_raw.loc[0:, 'collision_type'].replace('?', 'Unknown')

data_raw['property_damage'] = data_raw.loc[0:, 'property_damage'].replace('?', 'Unknown')

data_raw.isnull().sum()

dropping_columns = ['months_as_customer', 'policy_bind_date', 'age', 'policy_number', 'policy_annual_premium', 'insured_zip', 
                    'capital_gains', 'capital_loss', 'total_claim_amount', 'injury_claim', 'property_claim', 'vehicle_claim',
                   'auto_year']

data_cleaned = data_raw.drop(dropping_columns, axis=1)

data_preprocessed = pd.get_dummies(data_cleaned, drop_first=True)


targets = data_preprocessed['fraud_reported_Y']
features = data_preprocessed.drop(['fraud_reported_Y'], axis=1)

x_train, x_test, y_train, y_test = train_test_split(features, targets, test_size=0.2, random_state=420)

from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
logreg.fit(x_train, y_train)
y_pred = logreg.predict(x_test)

现在我正在尝试对测试输入(从 SQL 表导入的测试数据集)进行预测:

test = df['TestTable']
test = test[0]
sql = 'SELECT * FROM '+ test
test_raw = pd.read_sql(sql,cnxn)

#sample_rows = test_raw.sample(n=5)

test_raw.describe(include='all')

test_raw['collision_type'] = data_raw.loc[0:, 'collision_type'].replace('?', 'Unknown')

test_raw['property_damage'] = data_raw.loc[0:, 'property_damage'].replace('?', 'Unknown')

test_raw.isnull().sum()

print(test_raw.shape)

test_dropped = test_raw.drop(dropping_columns, axis=1)
test_preprocessed = pd.get_dummies(test_dropped, drop_first=True)

logreg = LogisticRegression()
logreg.fit(x_train, y_train)
test_predicted = logreg.predict(test_preprocessed)

这是我得到的错误:

Traceback (most recent call last):

  File "<ipython-input-149-e6d470e94433>", line 1, in <module>
    runfile('C:/Users/BusinessUser/Downloads/insurance_claim_fraud_detection-master/insurance_claim_fraud_detection.py', wdir='C:/Users/BusinessUser/Downloads/insurance_claim_fraud_detection-master')

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/BusinessUser/Downloads/insurance_claim_fraud_detection-master/insurance_claim_fraud_detection.py", line 402, in <module>
    test_predicted = logreg.predict(test_preprocessed)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\sklearn\linear_model\base.py", line 289, in predict
    scores = self.decision_function(X)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\sklearn\linear_model\base.py", line 270, in decision_function
    % (X.shape[1], n_features))

ValueError: X has 231 features per sample; expecting 1228

我的训练数据集有 999 行带有最终预测结果列,而测试数据集有 50 行没有预测结果列。其他列基本相同。

我是一个新手,我很确定关于这个模型训练有一些我不知道的基本知识。非常感谢你们帮助我。

【问题讨论】:

【参考方案1】:

使用函数@987654324 检查您用于预测的数据(test_preprocessed)的列数(特征)是否与用于训练/测试的数据(x_trainx_test)相同@例如或len(test_preprocessed.columns)

【讨论】:

您好@user2314737,感谢您的帮助!当我调用 pd.get_dummies() 时,我会说测试输入中的列数少于原始训练数据集中的列数,因为我的测试输入中的记录/行数较少。训练集和测试输入的特征/列数是否必须完全相同? 是的@anhnguyen 训练后的模型基本上是一个函数,它接受 n 维输入并给出一些其他值作为输出,其中 n 是特征数 您好 @user2314737 感谢您的帮助。那么有没有办法确保训练数据集和测试输入匹配的特征数量呢?我期望测试输入的记录比训练数据少,所以在将分类值转换为虚拟值后会导致更少的特征数量吗?如果我的知识有误,请纠正我。

以上是关于ValueError:X 每个样本有 231 个特征;期待 1228的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:X 每个样本有 29 个特征;期待 84

ValueError:找到样本数量不一致的输入变量:[2839,14195]

Sklearn:ValueError:发现样本数量不一致的输入变量:[1, 6]

ValueError:发现样本数量不一致的输入变量:[1, 74]

ValueError:发现样本数量不一致的输入变量:[143, 426]

ValueError:发现样本数量不一致的输入变量:[2750, 1095]