【发布时间】:2015-03-09 13:43:30
【问题描述】:
我一直在尝试这个:
- 根据数据集创建 X 特征和 y 依赖项
- 拆分数据集
- 规范化数据
- 使用 Scikit-learn 的 SVR 进行训练
这是使用填充随机值的 pandas 数据框的代码
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(20,5), columns=["A","B","C","D", "E"])
a = list(df.columns.values)
a.remove("A")
X = df[a]
y = df["A"]
X_train = X.iloc[0: floor(2 * len(X) /3)]
X_test = X.iloc[floor(2 * len(X) /3):]
y_train = y.iloc[0: floor(2 * len(y) /3)]
y_test = y.iloc[floor(2 * len(y) /3):]
# normalise
from sklearn import preprocessing
X_trainS = preprocessing.scale(X_train)
X_trainN = pd.DataFrame(X_trainS, columns=a)
X_testS = preprocessing.scale(X_test)
X_testN = pd.DataFrame(X_testS, columns=a)
y_trainS = preprocessing.scale(y_train)
y_trainN = pd.DataFrame(y_trainS)
y_testS = preprocessing.scale(y_test)
y_testN = pd.DataFrame(y_testS)
import sklearn
from sklearn.svm import SVR
clf = SVR(kernel='rbf', C=1e3, gamma=0.1)
pred = clf.fit(X_trainN,y_trainN).predict(X_testN)
给出这个错误:
C:\Anaconda3\lib\site-packages\pandas\core\index.py:542: FutureWarning:使用 iloc 时的切片索引器应该是整数和 非浮点“而不是浮点”,FutureWarning) -------------------------------------------------- ------------------------- ValueError Traceback(最近一次调用 最后)在() 34 clf = SVR(内核='rbf',C=1e3,伽玛=0.1) 35 ---> 36 pred = clf.fit(X_trainN,y_trainN).predict(X_testN) 37
C:\Anaconda3\lib\site-packages\sklearn\svm\base.py in fit(self, X, y, 样品重量) 174 175种子=rnd.randint(np.iinfo('i').max) --> 176 fit(X, y, sample_weight, solver_type, kernel, random_seed=seed) 177 # 查看此文件中对 np.iinfo 的其他调用的注释 178
C:\Anaconda3\lib\site-packages\sklearn\svm\base.py in _dense_fit(self, X, y, sample_weight, solver_type, kernel, random_seed) 第229章 第230章 --> 231 max_iter=self.max_iter, random_seed=random_seed) 232 233 self._warn_from_fit_status()
C:\Anaconda3\lib\site-packages\sklearn\svm\libsvm.pyd 在 sklearn.svm.libsvm.fit (sklearn\svm\libsvm.c:1864)()
ValueError: 缓冲区的维数错误(预期为 1,得到 2)
我不知道为什么。谁能解释一下?我认为这与预处理后转换回数据帧有关。
【问题讨论】:
-
错误在您的
y_trainN中,它产生了不正确的数组形状,以下工作:pred = clf.fit(X_trainN,y_trainN.squeeze().values).predict(X_testN),如果您查看在执行y_trainN.values时输出的内容,您会得到一个嵌套数组你想要的只是一个数组,即使你的 df 中只有一列,你应该做的是传递一列:pred = clf.fit(X_trainN,y_trainN[0]).predict(X_testN) -
如果你想要列的列表,你可以只做
a = list(df)而不是a = list(df.columns.values),请参阅相关的post。 -
谢谢,这真的很有帮助。认为你今天回答了我的很多问题!
-
我遇到了类似的错误。问题是我使用 1 个热向量作为 y 而不是类号。
标签: python numpy pandas scikit-learn svm