按照书上用波士顿房价作为数据集进行算法比较,为什么最后的输出数据是NAN?

我的算法

filename='housing_data.xlsx'
names= ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = pd.read_excel(filename,names=names)
pd.set_option('display.width',120)
array = data.values
X = array[:,0:13]
Y = array[:,13]
validation_size=0.2
seed=7
X_train, X_validation, Y_train, Y_validation= train_test_split(X,Y,test_size=validation_size,random_state=seed )
num_folds = 10
seed = 7
scoring = 'neg_mean_squared_error'
models ={}
models['LR'] = LinearRegression()
models['Lasso'] = Lasso()
models['EN'] = ElasticNet()
models['KNN'] = KNeighborsRegressor()
models['CART'] =DecisionTreeClassifier()
models['SVM'] = SVR()
results = []
for key in models:
    kfold = KFold(n_splits=num_folds,shuffle=True,random_state=seed)
    cv_result = cross_val_score(models[key],X_train,Y_train,cv=kfold,scoring=scoring)
    results.append(cv_result)
print('%s: %f(%f)' % (key,cv_result.mean(),cv_result.std()))

输出结果是

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

  warnings.warn("Estimator fit failed. The score on this train-test"
SVM: nan(nan)

 

你好,这个错误基本上都是你的数据中存在一些模型无法接受的数据导致的,你是不是没有观察你的数据啊?在进行建模之前需要观察自己读取的数据是否符合要求。

我建议你检查一下自己的数据是否读取正确了,或者利用下面的代码看看是否有缺失值。

# 统计缺失值
missing = data.isnull().sum()
# 筛选出大于0的属性
missing = missing[missing>0]
# 排序
missing.sort_values(inplace=True)
missing.plot.bar()

另外,你的数据格式不正确也可能会导致这个情况的发生。在进行模型训练之前你需要对特殊的数据格式(例如object)进行编码处理。你可以通过下面的代码检查一下是否有不是float类型的特征。

data.info()

具体的数据处理流程可以看我写的下面链接的内容,我在其中有详细的介绍:
【建议收藏】机器学习数据预处理(一)——缺失值处理方法(内附代码)