使用knn预测另一个DataFrame中的值(Python 3.6)

我创建了一个包含井日志地质数据的DataFrame,然后我创建了一个新列,根据不同的属性为每一行标记了一个名称。这意味着:现在每一行都有一个岩石名称。

我的问题是:我已经用所有数据训练了第一个DataFrame,现在我想预测一个新DataFrame的标签(岩石名称),这个新DataFrame具有与第一个DataFrame相同的列(属性)。但我不知道该怎么做。以下是我目前的代码:

import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierdata = pd.read_excel('wellA.xlsx')            #size (20956,26)well1 = pd.concat([data['GR'], data['NPHI'], data['RHOB'], data['SW'], data['VSH'], data['rock_name']], axis=1, keys = ['GR','NPHI','RHOB','SW','VSH','rock_name'])well1 = well1.drop(well1.index[0:15167])well1.dropna(axis=0, inplace=True)knn = KNeighborsClassifier(n_neighbors = 9)d = {'Claystone': 1, 'Calcareous Claystone': 2, 'Sandy Claystone': 3, 'Limestone': 4, 'Muddy Limestone': 5, 'Muddy Sandstone': 6, 'Sandstone': 7}well1['Label'] = well1['rock_name'].map(d)         #size (5412,7)X = well1[well1.columns[:5]]         #size (5412, 5)y = well1.rock_name                  #size (5412,)X_train, X_test, y_train, y_test = train_test_split (X, y, random_state = 0)#sizes: X_train(4059,5), X_test(1353,5) , y_train(4059,), y_test(1353,)knn.fit(X_train, y_train)      knn.score(X_test, y_test) data2 = pd.read_excel('wellB.xlsx')        #size (29070, 12)well2 = pd.concat([data2['GR'], data2['NPHI'], data2['RHOB'], data2['SW'], data2['VSH']], axis=1, keys = ['GR','NPHI','RHOB','SW','VSH'])well2.dropna(axis=0, inplace=True)         #size (2124, 5)# values of the propertiesgammaray = well2['GR'].values                             neutron = well2['NPHI'].valuesdensity = well2['RHOB'].valuesswat = well2['SW'].valuesvshale = well2['VSH'].valuesrock_name_pred = knn.predict([[gammaray, neutron, density, swat, vshale]])

然后我得到了以下错误:

Traceback (most recent call last):

File "C:\Users\laguiar\AppData\Local\Continuum\anaconda3\lib\site- packages\spyder\utils\site\sitecustomize.py", line 705, in runfileexecfile(filename, namespace)File "C:\Users\laguiar\AppData\Local\Continuum\anaconda3\lib\site- packages\spyder\utils\site\sitecustomize.py", line 102, in execfileexec(compile(f.read(), filename, 'exec'), namespace)File "C:/Users/laguiar/Desktop/Projeto Norne/exemploKNN.py", line 41, in <module> rock_name_pred = knn.predict([[gammaray, neutron, density, swat, vshale]])File "C:\Users\laguiar\AppData\Local\Continuum\anaconda3\lib\site- packages\sklearn\neighbors\classification.py", line 143, in predictX = check_array(X, accept_sparse='csr')File "C:\Users\laguiar\AppData\Local\Continuum\anaconda3\lib\site- packages\sklearn\utils\validation.py", line 451, in check_array% (array.ndim, estimator_name))ValueError: Found array with dim 3. Estimator expected <= 2.

回答:

错误提示KNN期望数组的维度小于或等于2。然而,在您的脚本中,您的属性,如gammaray,是numpy数组。
当您在knn.predict调用中写[[gammaray, neutron, density, swat, vshale]]时,双括号增加了2个维度,因此您得到的是一个3维数组。
尝试这样调用predict方法:
rock_name_pred = knn.predict([gammaray, neutron, density, swat, vshale])

或者您可以直接在DataFrame上调用predict方法,就像fit方法一样:
rock_name_pred = knn.predict(well2)

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注