我首先要说我对熊猫和numpy(以及一般的机器学习)还是陌生的。
我正在尝试学习一些基本的机器学习算法,并且正在做线性回归。我已经使用matlab完成了此问题,但想尝试在python中实现它-因为这是一种更实际使用的语言。我在使用这些库进行基本矩阵运算时遇到了非常困难的时间,我认为这是由于缺乏对熊猫如何索引数据帧的理解...
我发现有几篇文章谈论iloc和ix之间的区别,并且不赞成使用ix,所以请使用iloc,但是iloc会给我带来很多麻烦。我只是想将一个数据框中的前n-1列拉到一个新的数据框中,然后将最后一列拉到另一个数据框中以获取我的标签值。然后,我想执行一次成本函数,以查看theta = 0时我当前的成本。当前,我的数据集只有一个标签-但我想编码,好像我有更多标签一样。这是我的代码和输出:
path = os. getcwd() + '\\ex1data1.txt'
data = pd.read_csv(path, header=None)
numRows = data.shape[0]
numCols = data.shape[1]
X = data.iloc[:,0:numCols-1].copy()
theta = pd.DataFrame(np.zeros((X.shape[1], 1)))
y = data.iloc[:,-1].copy()
#start computing cost sum((X-theta)-y).^2)
predictions = X.dot(theta)
print("predictions shape: {0}".format(predictions.shape))
print(predictions.head())
print("y shape: {0}".format(y.shape))
print(y.head())
errors = predictions.subtract(y)
print("errors shape: {0}".format(errors.shape))
print(errors.head())
输出:
predictions shape: (97, 1)
0
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
y shape: (97, 1)
1
0 17.5920
1 9.1302
2 13.6620
3 11.8540
4 6.8233
errors shape: (97, 2)
0 1
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
我可以看到y和X具有相同的形状,但是由于某些原因,当我显示它们时-似乎y从第1列(它在第一个数据帧中的原始位置)开始索引,而X有了其原始列结果是0。因此,熊猫正在正确进行减法运算,并用NaN替换所有丢失的值。由于y没有第0列的值,它们都是NaN
,而X没有第1列的值,它们都是NaN
,结果是97x2 NaN
矩阵。
如果我使用 y = data.ix[:,-1:0]
-上面的代码进行了正确的计算。输出:
errors shape: (97, 1)
0
0 -6.1101
1 -5.5277
2 -8.5186
3 -7.0032
4 -5.8598
但是我一直试图远离ix,因为它已经过时了。
如何告诉pandas
新矩阵的起始列为0,为什么这不是默认行为?
答案 0 :(得分:2)
看起来您实际上想要进行的计算是在系列上(各个列)。因此,您应该可以:
predictions[0].subtract(y[1])
获得所需的值。这看起来有点令人困惑,因为您有数字作为DataFrame列,正在选择所需的列(0和1)并在它们之间进行减法。
或者像您最初建议的那样使用iloc,这可以使您更像矩阵样式索引,您可以执行以下操作:
predictions.iloc[:, 0].subtract(y.iloc[:, 0])
因为要在每个DataFrame中全部行和第一列