我想在我的数据框的第一列中找到回归系数的数量。我的代码抛出
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_)