线性回归
在线性回归中,我们尝试找到可以预测目标与特征变量之间关系的最佳拟合线。简而言之,它借助一些称为“斜率和截距”的估计器,可以帮助我们针对X的每个值找到因变量Y的值。
在机器学习领域,线性回归被认为是我们开始时最基本的问题,因为线性回归模型很容易解释,我们任何机器学习爱好者最初都是从执行线性回归模型开始的。
在本文中,我们将看到如何使用神经网络来解决线性回归问题,但不使用 Keras,我们将创建一个模型只使用本地 python 和 numpy。
让我们开始吧!
加载所需的库
让我们通过导入所需的库开始创建我们的神经网络。
import pandas as pd
import numpy as np
import seaborn as sns
创建一个读取数据的函数
我们将在本文中使用的数据集是可从Kaggle下载的NASA翼型叶片数据集。我们将加载此数据集并将其拆分为测试集和训练集。
#Used for reading, scaling & spliting the dataset
def readdata(filename, cols, delim = "\t"):
#Reading dataset
df = pd.DataFrame(pd.read_csv(filename, delim))
df.columns = cols
X = df[cols[:5]]
y = df[cols[5]]
print(X.shape, y.shape)
y = np.array(y)
#Scaling dataset
data = StandardScaler().fit_transform(X)
#Splitting dataset
x_data_train = data[:int(len(data)*0.8),:]
y_data_train = y[:int(len(y)*0.8)]
x_data_test = data[int(len(data)*0.8):,:]
y_data_test = y[int(len(y)*0.8):]
#Returning data after splitting
return x_data_train, y_data_train, x_data_test, y_data_test
为线性回归创建一个类
为了使这些代码易于解释,去除代码的冗余,增加代码的可用性,我们将创建一个类线性回归,在这个类中,我们将创建用于训练数据和预测数据的函数。
在代码的每个部分之前都用注释解释了代码,这将有助于你清楚地了解代码。
#Linear Regression class
class LinearRegression:
#Constructor
def __init__(self, l_rate, iterations):
self.l_rate = l_rate
self.iterations = iterations
self.b = 0
self.W = np.random.randn(x_data_train.shape[1],1)
self.costs = []
self.train_acc = []
#Training and Storing Weights & Bias
def train(self, x_data_train, y_data_train):
#Storing no of instances of data
m = x_data_train.shape[0]
for i in range(self.iterations):
#Finding prediction & calculating residuals
y_pred = np.dot(x_data_train, self.W) + self.b
residuals = np.subtract(y_pred.T,y_data_train)
#Calculating cost
cost = ((1/m)*np.sum(residuals**2))
#Calculating dw & db
dw = (1/m) * np.dot(x_data_train.T, residuals.T)
db = (1/m) * np.sum(residuals)
self.W = self.W - self.l_rate * dw
self.b = self.b - self.l_rate * db
#Storing cost and accuracy per epoch
self.costs.append(cost)
self.train_acc.append(self.LinRegaccuracy(y_data_train, y_pred)[0])
#Predicting the output
def classify(self, x_data_test):
return np.dot(x_data_test, self.W) + self.b
#Calculating accuracy
def LinRegaccuracy(self, y_data_test, y_pred_test):
total_error = 0
for i in range(0, len(y_data_test)):
errSet= abs((y_pred_test[i] - y_data_test[i]) / y_data_test[i])
total_error += errSet
total_error = (total_error / len(y_data_test))
accuracyScore = 1 - total_error
return accuracyScore
#Returning list of cost
def getCost(self):
return self.costs
#Returning list of accuracy
def getTrainAcc(self):
return self.train_acc
在上面的这一部分中,我们可以在训练函数中清楚地看到如何找到梯度和残差,并使用它们来更新权重和偏差。我还创建了一些函数,这些函数将存储每个epoch 的 accuracy 和 cost,它们将用于创建绘图以使其可视化。
接下来,我们将创建程序的主要部分,我们将在其中调用这些类和函数。
lr = LinearRegression(0.01, 700)
#Storing Optimal Weights & Bias by Training Model
lr.train(x_data_train, y_data_train)
#Calling Train & Test Accuracy
y_prediction_train = lr.classify(x_data_train)
y_prediction_test = lr.classify(x_data_test)
accuracy_train = lr.LinRegaccuracy(y_data_train, y_prediction_train)
accuracy_test = lr.LinRegaccuracy(y_data_test, y_prediction_test)
#Printing Tain & Test Accuracy
print("accuracy train: ", accuracy_train, "accuracy test: ", accuracy_test)
在上面的代码部分中,我们可以清楚地看到我们如何调用将读取数据的所有函数,将其传递给训练函数进行训练,并最终预测此线性回归神经网络的准确性。
现在,我们将进行可视化。
#Plotting cost / epochs
df1 = pd.DataFrame({'no_of_epochs':np.arange(len(lr.getCost())),'costs':lr.getCost()})
sns.lineplot(data=df1, x="no_of_epochs", y="costs").set_title("Costs");
#Plotting accuracy / epochs
df2 = pd.DataFrame({'no_of_epochs':np.arange(len(lr.getTrainAcc())),'accuracy':lr.getTrainAcc()})
sns.lineplot(data=df2, x="no_of_epochs", y="accuracy").set_title("Accuracy");
总结
在这篇文章中,我们看到了如何只使用 numpy 和本地 python 来创建一个线性回归的神经网络。快来试试吧~
· END ·
HAPPY LIFE