在scikit learn中将pandas NumPy数组作为特征向量传递?

在scikit learn中将pandas NumPy数组作为特征向量传递?,pandas,scikit-learn,python-3.5,Pandas,Scikit Learn,Python 3.5,我有一个由5个不同值组成的向量,用作样本值,标签是一个0、1或3的整数。当我将数组作为样本传递时,机器学习算法就会工作,但我得到了这个警告。如何传递特征向量而不获得此警告 import numpy as np from numpy import random from sklearn import neighbors from sklearn.model_selection import train_test_split import pandas as pd filepath = 'tes

我有一个由5个不同值组成的向量,用作样本值,标签是一个0、1或3的整数。当我将数组作为样本传递时,机器学习算法就会工作,但我得到了这个警告。如何传递特征向量而不获得此警告

import numpy as np
from numpy import random

from sklearn import neighbors
from sklearn.model_selection import train_test_split
import pandas as pd

filepath = 'test.csv'

# example label values
index = [0,1,3,1,1,1,0,0]

# example sample arrays
data = []
for i in range(len(index)):
    d = []
    for i in range(6):
        d.append(random.randint(50,200))
    data.append(d)

feat1 = 'brightness'
feat2, feat3, feat4 = ['h', 's', 'v']
feat5 = 'median hue'
feat6 = 'median value'

features = [feat1, feat2, feat3, feat4, feat5, feat6]

df = pd.DataFrame(data, columns=features, index=index)
df.index.name = 'state'

with open(filepath, 'a') as f:
    df.to_csv(f, header=f.tell() == 0)

states = pd.read_csv(filepath, usecols=['state'])

df_partial = pd.read_csv(filepath, usecols=features)

states = states.astype(np.float32)
states = states.values
labels = states

samples = np.array([])
for i, row in df_partial.iterrows():
    r = row.values
    samples = np.vstack((samples, r)) if samples.size else r

n_neighbors = 5

test_size = .3
labels, test_labels, samples, test_samples = train_test_split(labels, samples, test_size=test_size)
clf1 = neighbors.KNeighborsClassifier(n_neighbors, weights='distance')
clf1 = clf1.fit(samples, labels)

score1 = clf1.score(test_samples, test_labels)

print("Here's how the models performed \nknn: %d %%" %(score1 * 100))
警告:

"DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel(). clf1 = clf1.fit(samples, labels)"

尝试更换

states=states.values
by
states=states.values.flatte()

clf1=clf1.fit(样本,标签)
by
clf1=clf1.fit(样本,标签.flatte())

states=states.values
包含存储在panda数据框中的正确标签,但它们存储在不同的行中。使用
.flant()
将所有标签放在同一行上。()

在Sklearn的KNeighborsClassifier文档中
(),它们在示例中显示标签必须存储在同一行:
y=[0,0,1,1]

从数据帧状态检索数据时,它存储在多行(列向量)中,而预期值存储在单行中

您还可以尝试使用
ravel()
函数,该函数用于创建连续的展开数组

numpy.ravel(array,order='C'):
返回连续的平坦数组(包含所有输入数组元素且类型与之相同的1D数组)

尝试:


states=states.values.ravel()
代替了
states=states.values

,所以ravel()和flatte()本质上是一样的?我对此做了一些研究,虽然ravel()和flatte()是将ndarray转换为1D数组的两种方法,但它们有一些区别。Ravel返回对原始数组的引用,数组中的更改反映在原始数组中,而展平复制原始数组和对数组的更改不会影响原始数组。因为Ravel只是原始数组的一个引用,完全避免了数据的复制,所以它比flatte快。x输入意味着什么?它是一个由n_个样本x n_个样本或其他东西组成的二维数组?还是像上面说的那样只是一个列表?我把sklearn文档的截图放在上面的问题中^^^^非常欢迎您!关于x输入,它是一个数组/矩阵,用于保存具有n_特征的点。在您的例子中,您的点有6个特征(亮度、h、s、v、中间色调和中间值),因此n_特征=6。因此,X包含28个点,每个点有6个特征,因此其形状[n_示例,n_特征]将为[28,6]。请尝试在
clf1=clf1之前添加
print(samples)
。在代码中拟合(示例,标签)
。这将帮助你更好地想象它。