【问题标题】:raise ValueError ValueError: Found array with 0 feature(s) (shape=(124, 0)) while a minimum of 1 is requiredraise ValueError ValueError: 找到具有 0 个特征的数组 (shape=(124, 0)) 而至少需要 1
【发布时间】:2021-03-06 12:19:35
【问题描述】:

我正在尝试对具有 124 行和 13 个特征的数据集应用 PCA(主成分分析)。我正在尝试查看使用多少功能(通过逻辑回归)来获得最准确的预测,我在这里有这段代码:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/'
    'machine-learning-databases/wine/wine.data', header=None)

from sklearn.model_selection import train_test_split
X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
X_train, X_test, y_train, y_test = \
    train_test_split(X, y, test_size=0.3, stratify=y, random_state=0)
# standardize the features
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)

from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
# initializing the PCA transformer and
# logistic regression estimator:
pca = PCA() #prof recommends getting rid of m_components = 3 
lr = LogisticRegression()
# dimensionality reduction:
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)

"""
rows = len(X_train_pca)
columns = len(X_train_pca[0])
print(rows)
print(columns)
"""

# fitting the logistic regression model on the reduced dataset:
for i in range(12):
    lr.fit(X_train_pca[:, :i], y_train)
    y_train_pca = lr.predict(X_train_pca[:, :i])
    print('Training accuracy:', lr.score(X_train_pca[:, :i], y_train))

我收到错误消息:raise ValueError("Found array with %d feature(s) (shape=%s) while" ValueError: 找到具有 0 个特征的数组 (shape=(124, 0)),而至少需要 1 个。

据我了解,for 循环范围在 12 处是正确的,因为它将遍历所有 13 个功能(0 到 12),我试图让 for 循环遍历所有功能(通过一个功能进行逻辑回归,然后是两个,然后是 3.... 直到所有 13 个特征,然后查看它们的准确度,看看有多少特征最有效)。

【问题讨论】:

  • 您可能需要执行y=y.reshape(y.shape[0], 1) 才能为其提供正确的尺寸。
  • 我在 for 循环的正上方添加了它并没有消除错误

标签: python for-loop logistic-regression pca


【解决方案1】:

你的错误:

X_train_pca[:, :i]i=0 会给你一个空数组,作为.fit() 的输入无效。

如何解决:

如果你想只用截距拟合模型,你可以在LogisticRegression() 中显式设置fit_intercept=False,并在你的 X 中添加一个额外的列(最左边),用 1 填充(作为截距)。

【讨论】:

  • 我正在尝试通过带有 for 循环的 Logistic 回归进行拟合,以便我可以拟合 1 个功能,然后是 2,然后是 3... 一直到我适合 13 个功能,所以我可以看到有多少功能效果最好
  • 如果我将 for 循环设为 range(1,13) 会怎样?
  • 哦,哇,在我将 range(1,13) 放入 for 循环后不再出现错误
  • 如果你有 13 个特征,那么在这种情况下端点应该是 14,即对于 i in range(1,14)
猜你喜欢
  • 2019-02-02
  • 2022-01-16
  • 2019-09-25
  • 2022-12-05
  • 2016-10-04
  • 2023-03-19
  • 2019-04-24
  • 2020-09-06
  • 2020-04-11
相关资源
最近更新 更多