cross_val_score报错原因及修复:Windows环境连续标签适配问题
问题描述
我跟着一份机器学习教程写的代码,在MacBook Air上能正常运行,但在Windows机器上执行时报错。
报错代码行:
cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
完整报错信息:
Traceback (most recent call last): File "D:\Applications\pythonProject\venv\lib\site-packages\joblib\parallel.py", line 862, in dispatch_one_batch tasks = self._ready_batches.get(block=False) File "C:\Users\danie\AppData\Local\Programs\Python\Python39\lib\queue.py", line 168, in get raise Empty _queue.Empty During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\danie\AppData\Roaming\JetBrains\PyCharmCE2022.2\scratches\FY23 SCI FAIR\main.py", line 63, in <module> cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring=None) File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_validation.py", line 515, in cross_val_score cv_results = cross_validate( File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_validation.py", line 266, in cross_validate results = parallel( File "D:\Applications\pythonProject\venv\lib\site-packages\joblib\parallel.py", line 1085, in __call__ if self.dispatch_one_batch(iterator): File "D:\Applications\pythonProject\venv\lib\site-packages\joblib\parallel.py", line 873, in dispatch_one_batch islice = list(itertools.islice(iterator, big_batch_size)) File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_validation.py", line 266, in <genexpr> results = parallel( File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 340, in split for train, test in super().split(X, y, groups): File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 86, in split for test_index in self._iter_test_masks(X, y, groups): File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 717, in _iter_test_masks test_folds = self._make_test_folds(X, y) File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 660, in _make_test_folds raise ValueError( ValueError: Supported target types are: ('binary', 'multiclass'). Got 'continuous' instead.
完整代码:
# Python version import sys print('Python: {}'.format(sys.version)) # scipy import scipy print('scipy: {}'.format(scipy.__version__)) # numpy import numpy print('numpy: {}'.format(numpy.__version__)) # matplotlib import matplotlib print('matplotlib: {}'.format(matplotlib.__version__)) # pandas import pandas print('pandas: {}'.format(pandas.__version__)) # scikit-learn import sklearn print('sklearn: {}'.format(sklearn.__version__)) # compare algorithms from pandas import read_csv from matplotlib import pyplot from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score from sklearn.model_selection import StratifiedKFold from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC # Load dataset url = "energyFormatted.csv" names = ['TOTAL', 'PURCHASED', 'NUCLEAR', 'SOLAR', 'WIND', 'NATURAL_GAS', 'COAL', 'OIL'] dataset = read_csv(url, names=names) print(dataset.shape) # Split-out validation dataset array = dataset.values X = array[:, 0:4] y = array[:, 4] X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True) # Spot Check Algorithms models = [] models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr'))) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC(gamma='auto'))) # evaluate each model in turn results = [] names = [] for name, model in models: kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True) cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy') results.append(cv_results) names.append(name) print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))
数据集(energyFormatted.csv):
28564,0,6284.08,1713.84,19.9948,19994.8,19.9948,19.9948 28411,0,6250.42,852.33,0,20740.03,568.22,0 27515,0,6053.3,550.3,0,20361.1,550.3,0 24586,491.72,5408.92,245.86,0,17947.78,491.72,0 26653,533.06,6130.19,0,0,18923.63,1066.12,0 26836,805.08,6172.28,0,0,18785.2,1073.44,0 26073,1303.65,5736.06,0,0,17990.37,1042.92,0 27055,1352.75,6222.65,0,0,18397.4,1082.2,0 26236,1311.8,6034.28,0,0,17578.12,1311.8,0 26020,1821.4,3903,0,0,18994.6,1040.8,260.2 26538,0,4246.08,265.38,13799.76,6369.12,0,1326.9 25800,3354,5160,0,0,14964,1290,1032 26682,3468.66,5603.22,0,0,14941.92,1600.92,1067.28 24997,3499.58,5499.34,0,0,13248.41,1499.82,1249.85 25100,3765,4769,0,0,13052,1506,2008 24651,4190.67,4930.2,0,0,12325.5,1232.55,1972.08 12053,0,1084.77,0,3133.78,6508.62,0,723.18 11500,2070,2415,0,0,4255,690,2070
问题分析与解决
1. 报错核心原因
从报错信息可以明确:
- 你使用的全部是分类模型(LogisticRegression、DecisionTreeClassifier等),但目标变量
y(对应数据集的WIND列)是连续数值类型(如19.9948、13799.76这类浮点数),属于回归任务的目标类型,分类模型无法直接处理。 - 同时你用了
StratifiedKFold交叉验证,这个方法是专门为分类任务设计的,需要保持每折的类别分布一致,完全不支持连续型目标变量。
2. 跨平台运行差异的原因
并非Mac和Windows系统本身的问题,而是两台机器的scikit-learn版本不一致:
- 你的Mac上安装的是旧版本scikit-learn,对
StratifiedKFold传入连续型目标变量的校验不严格,或者因数据分布巧合(比如目标变量唯一值较少)没有触发报错。 - Windows机器上是较新版本scikit-learn,增加了严格的类型校验,直接抛出了正确的错误提示。
3. 修复方案
根据你的实际任务需求,有两种选择:
方案一:转为分类任务
如果你的目标是预测WIND的类别(比如划分成“低风电”“中风电”“高风电”),可以对目标变量进行离散化处理:
# 将WIND列分为3个类别 dataset['WIND'] = pandas.cut(dataset['WIND'], bins=3, labels=['low', 'medium', 'high']) # 后续代码保持不变,此时y是分类变量,适配StratifiedKFold和分类模型
方案二:转为回归任务
如果你的目标是预测WIND的具体数值,需要更换为回归模型和适合回归的交叉验证方法:
- 替换分类模型为回归模型:
from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.neighbors import KNeighborsRegressor from sklearn.svm import SVR models = [] models.append(('LR', LinearRegression())) models.append(('KNN', KNeighborsRegressor())) models.append(('CART', DecisionTreeRegressor())) models.append(('SVM', SVR(gamma='auto')))
- 将
StratifiedKFold替换为普通KFold(回归任务不需要保持类别分布):
from sklearn.model_selection import KFold # 替换循环内的kfold定义 kfold = KFold(n_splits=10, random_state=1, shuffle=True)
- 更换回归任务的评估指标(不能用accuracy,改用回归常用指标):
# 示例:使用负均方误差作为评估指标 cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='neg_mean_squared_error') # 或者用R²分数 # cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='r2')
内容的提问来源于stack exchange,提问作者donutgoos
相关产品推荐
相关产品推荐

