【问题标题】:For loop problem in python for machine Learning用于机器学习的python中的for循环问题
【发布时间】:2020-04-02 18:53:27
【问题描述】:

大家好,我正在尝试对这个保险数据集执行 K 折交叉验证,但我尝试使用 for 循环迭代整数数组。输出给我以下错误:

ValueError: The number of folds must be of Integral type. [3, 4, 5, 6, 7, 8, 9, 10, 11, 12] of type <class 'list'> was passed.

谁能解释一下这个错误是什么以及如何解决它。下面是我的 K 折交叉验证代码。

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import VarianceThreshold,mutual_info_classif,mutual_info_regression
from sklearn.feature_selection import SelectKBest, SelectPercentile

data_ = pd.read_csv("insurance.csv") 
print(data_.head())

# Create dummies

data_dummies= pd.get_dummies(data_, columns = ['sex','region','smoker'])
print(data_dummies.head())
data_dummies = pd.DataFrame(data_dummies)
data_cleaned = data_dummies.drop(['sex_female','region_southwest','smoker_no'],axis = 'columns')
X=  data_cleaned.drop(['charges'], axis = 'columns')
y = data_cleaned['charges']
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 0)

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
ind = [3,4,5,6,7,8,9,10,11,12]


for  i in ind:


     kfold = KFold(n_splits=ind,shuffle=True,random_state=0)
     model = LinearRegression()
     scores = cross_val_score(model,X,y,cv=kfold,scoring='neg_mean_squared_error')

print(scores)

【问题讨论】:

  • 回答热点有用吗?

标签: python machine-learning scikit-learn k-fold


【解决方案1】:

您在 KFold 的 n_splits 参数中传递整个列表 ind,而不是遍历其元素 i,这是您的意图。另外,为什么要分配一个列表?你不想做吗

for i in range(3, 13):
    kfold = KFold(n_splits=i,shuffle=True,random_state=0)
    model = LinearRegression()
    scores = cross_val_score(model,X,y,cv=kfold,scoring='neg_mean_squared_error')
    print(scores)

【讨论】:

  • 在while的情况下可以不使用for循环吗?但是你的输出给出了一个一维数组。
  • 我正在尝试查找 K=3、K=4、...K=12 的错误。对于每个 K,应该有 K 个输出
  • @Murad24 一维结果是因为 print(scores) 不在循环中(因此只打印最后一个值),与错误无关(关于您的问题)。此处显示的循环与您的问题中显示的循环完全相同,减去错字,因此答案解决了问题,我建议您接受它 - 请参阅What should I do when someone answers my question?
  • 如您所见,脱离问题的确切上下文(并且没有任何实际收获,因为您的 while 循环实际上与 OP 使用的 for 循环 + 列表相同)可以容易导致沟通不畅的问题,在非绝对必要时应避免。
  • @desertnaut 我无意偏离原来的问题,你所说的完全正确,所以我更新了我的答案。感谢您的观察。
猜你喜欢
  • 2015-06-02
  • 1970-01-01
  • 2015-02-23
  • 2017-04-20
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多