类型错误:类型 'numpy.float64' 的对象在打印数据帧中第一列的回归系数时没有 len()



我想在我的数据框的第一列中找到回归系数的数量。我的代码抛出

TypeError: object of type 'numpy.float64' has no len()
from sklearn.linear_model import LinearRegression
df = pd.read_csv("master.csv")    
# Drop redundant features
X = df.drop(['suicides/100k pop', 'country-year', 'suicides_no'], axis=1)
y = df['suicides/100k pop']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression(n_jobs=4, normalize=True, copy_X=True)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"There are {len(model.coef_[0])} regression coefficients:")
print(model.coef_[0])

X_train

print(type(X_train))
> <class 'scipy.sparse.csr.csr_matrix'>

y_train

print(type(y_train))
> <class 'pandas.core.series.Series'>

回溯:

> --------------------------------------------------------------------------- TypeError                                 Traceback (most recent call
> last) /tmp/ipykernel_6232/341058392.py in <module>
>       1 # Check number of and values of coefficients
> ----> 2 print(f"There are {len(model.coef_[0])} regression coefficients:")
>       3 print(model.coef_[0])
> 
> TypeError: object of type 'numpy.float64' has no len()

我担心你在建模部分听起来很困惑,这会导致你在编程部分请求无效的东西。

我想找到我的数据框的第一列的回归系数的数量。

没有这样的事。根据定义,线性回归中的系数数量等于变量的数量,即数组/数据框中的列;因此,数据框架的第一列总是有且只有一个系数。

同样,您的print语句:
print(f"There are {len(model.coef_[0])} regression coefficients:")

是不正确的;回归系数的个数就是len(model.coef_)model.coef_[0]是这些系数中的第一个;它将始终是一个单一的数字,这就是为什么len(model.coef_[0])将始终产生一个(预期的和合理的)错误(单个数字没有任何长度)。

用文档中提供的示例演示上述内容:

import numpy as np
from sklearn.linear_model import LinearRegression
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) # 2 variables/columns
# y = 1 * x_0 + 2 * x_1 + 3
y = np.dot(X, np.array([1, 2])) + 3
model = LinearRegression()
model.fit(X, y)

这里,我们在X中有两个变量(列),所以它将是

len(model.coef_)
# 2

X.shape[1] == len(model.coef_)
# True

通过定义。

(注意,截距不包括在系数中;它与model.intercept_)

单独返回因此,为了真正得到你在print语句中似乎请求的东西,你应该将语句更改为

print(f"There are {len(model.coef_)} regression coefficients:")
print(model.coef_)

请记住,报告的数字将不包括拦截。

在我的例子中,上面的命令将产生正确的结果:

There are 2 regression coefficients:
[1. 2.]

如果你还想包含完整的截距项,你应该加上:

print("and the intercept term is:")
print(model.intercept_)

当你使用[0]时,你是在"呼叫"。特定的值。它是一个数字,因此它没有len(), len()是一个字符串函数。

如果你想打印出len,使用:

len(model.coef_)

相关内容

  • 没有找到相关文章