无法计算梯度下降线性回归

2024-09-29 13:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在从事梯度下降项目

我选择nba统计数据作为我的数据,所以我从basketball reference下载了3Pts数据和pts数据,并成功绘制了散点图。然而,结果似乎并不正确

我的散点图正朝着右上(因为3分越多通常意味着得分越多,所以这是有意义的)

但我的梯度下降线是向左上的,我不知道怎么了

import pandas as pd
import numpy as np
from sklearn import linear_model
from matplotlib import pyplot as plt


data = pd.read_csv('C:/Users/jeehw/Documents/FG3M_PTS_2021.csv')


X = data.iloc[:,1]
Y = data.iloc[:,2]

plt.figure(figsize=(8,6))
plt.xlabel('FG3M')                                  
plt.ylabel('PTS')
plt.scatter(X,Y)
plt.show()

m = 0
c = 0

L = 0.001
epochs = 200

n = float(len(X))

for i in range(len(X)):
Y_pred = m*X + c
m_Grad = (1/n) * sum(X * (Y_pred - Y))
c_Grad = (1/n) * sum(Y_pred - Y)


m = m - L* m_Grad
c = c - L* c_Grad

Y_pred = m*X + c

plt.scatter(X, Y)
plt.scatter(X, Y_pred)
plt.show()

Tags: csv数据fromimportdataaspltpts
1条回答
网友
1楼 · 发布于 2024-09-29 13:25:47

这段代码中的一些东西没有真正意义。你想从头开始做回归吗?因为你确实需要学习,但从不应用它。关于如何使用scikit学习回归here,您可以参考此链接。我也会考虑和其他算法一起玩。

我相信这就是你在这里要做的:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
from matplotlib import pyplot as plt


#data = pd.read_csv('C:/Users/jeehw/Documents/FG3M_PTS_2021.csv')
raw_data = pd.read_html('https://www.basketball-reference.com/leagues/NBA_2021_totals.html')[0]
raw_data  = raw_data[raw_data['Rk'].ne('Rk')]

data = raw_data[['Player','3P','PTS']]
data[['3P','PTS']] = data[['3P','PTS']].astype(int)

X = data.iloc[:]['3P'].values
y = data.iloc[:]['PTS'].values

plt.figure(figsize=(8,6))
plt.xlabel('FG3M')                                  
plt.ylabel('PTS')
plt.scatter(X,y)

plt.xticks(np.arange(min(X), max(X)+1, 20))
plt.yticks(np.arange(min(y), max(y)+1, 100))
plt.show()


# Split data into test and Train
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

# Create linear regression object
regr = linear_model.LinearRegression()

# Train the model using the training sets
regr.fit(X_train.reshape(-1, 1), y_train)

# Make predictions using the testing set
y_pred = regr.predict(X_test.reshape(-1, 1))



# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean squared error
print('Mean squared error: %.2f'
      % mean_squared_error(y_test, y_pred))
# The coefficient of determination: 1 is perfect prediction
print('Coefficient of determination: %.2f'
      % r2_score(y_test, y_pred))

# Plot outputs
plt.scatter(X_test, y_test,  color='black')
plt.plot(X_test, y_pred, color='red', linewidth=3)

plt.xticks(np.arange(min(X_test), max(X_test)+1, 20))
plt.yticks(np.arange(min(y_pred), max(y_pred)+1, 100))

plt.xlabel('FG3M')                                  
plt.ylabel('PTS')

plt.show()

enter image description here

enter image description here

那里有一些噪音。你有很多球员得分很多,他们从来没有投过三分球,更不用说一分了。所以我会考虑先做大量的数据清理工作。(可能只考虑至少尝试过50次3分的球员?或者去掉中锋?如果球员换了球队,他们可能会在数据集中出现几次,每个球队的总数都是这样的,所以有一些冗余…但我不会花时间去清理,因为这超出了问题的范围)。我也会测试其他机器学习算法。但是上面的代码至少会让你去玩。玩得开心

相关问题 更多 >