我正在尝试创建一个机器学习算法来测试一些房屋数据的cross_val_score
,以确定哪个算法在确定房屋价值方面最准确。我使用了之前项目中预测鸢尾花种类时展示的框架,尽管这个数据集要大得多,考虑的类别也更多(这是506x14
,之前的是150x4
)。
我期望X是所有值的数组,不包括最后一列,即房屋中位数值,Y。我使用了一个简单的分割器,最初尝试直接将这些值传递给cross_val_score
。然而,我得到一个错误,指出该函数只接受二元或多类,而它接收的是连续数据。Stack上的一个回答建议使用keras.utils.to_categorical
将数据转换为二元数据,所以我尝试了这种方法。但它抛出了错误支持的目标类型为:('binary', 'multiclass')。但得到的是'multilabel-indicator'
。我找到的唯一解决方案是在StratifiedKFold
之后使用to_categorical
,但这似乎并没有解决错误。
# 加载数据集url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv"names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']dataset = read_csv(url, names=names)# 分割验证数据集array = dataset.valuesX = array[:, 0:13]y = array[:, 13]X_train, X_validation, Y_train, Y_validation, = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True)# 尝试不同算法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')))# 依次评估每个模型results = []names = []for name, model in models: kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True) # 将类向量转换为二元类矩阵 X_train = keras.utils.to_categorical(X_train, 0) X_validation = keras.utils.to_categorical(X_validation, 0) Y_train = keras.utils.to_categorical(Y_train, 0) Y_validation = keras.utils.to_categorical(Y_validation, 0) 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()))# 比较算法pyplot.boxplot(results, labels=names)pyplot.title('Algorithm Comparisons')pyplot.show()
任何帮助都将非常感激,以便找出为什么我的数据无法正确通过评分器。
回答:
首先,必须指出,分类和回归是机器学习中的不同问题,你可以在这里了解更多这里。
现在,你正在用为分类问题(鸢尾花)开发的解决方案来解决回归问题(房屋)。
你有两个选择
- 以回归方式解决问题(你使用的一些模型可能没有回归版本)
- 将你的问题转换为分类(这个问题在这里被问到过这里!)
这是我对第一个解决方案的实现,只对你的代码做了小的修改;)
models = []models.append(('LR', LinearRegression()))# models.append(('LDA', LinearDiscriminantAnalysis()))models.append(('KNN', KNeighborsRegressor()))models.append(('CART', DecisionTreeRegressor()))models.append(('NB', GaussianProcessRegressor()))models.append(('SVM', SVR(gamma='auto')))# 依次评估每个模型results = []names = []for name, model in models: regr = model cv_results = cross_val_score(regr, X, y, cv=5) results.append(cv_results) names.append(name) print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))# 比较算法pyplot.boxplot(results, labels=names)pyplot.title('Algorithm Comparisons')pyplot.show()
最后,train_test_split
和cross_val_score
是评估模型质量的两种替代方法。同时使用两者是不推荐的!