使用原生 python 的神经网络

线性回归

在线性回归中,我们尝试找到可以预测目标与特征变量之间关系的最佳拟合线。简而言之,它借助一些称为“斜率和截距”的估计器,可以帮助我们针对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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值