当前位置: 首页 > news >正文

Python 类继承解释

 一、说明

        类继承是Python中数据科学家和机器学习工程师需要了解的一个重要概念。在这里,我们的专家解释了它的工作原理。
           在Python中,类包含属性和方法。属性是存储数据的变量。类方法是属于类的函数,通常对类属性执行一些逻辑。在本文中,我们将介绍类继承、父类和子类、继承的好处,并查看 Python 中继承的一些示例。

二、PYTHON 中的类继承

        继承允许您定义一个新类,该新类可以访问已定义的另一个类的方法和属性。具有将被另一个类继承的方法和属性的类称为父类。能够访问父类的属性和方法的类称为子类。

        萨德拉赫·皮埃尔的更多作品Python 中的函数包装器:模型运行时和调试

 

2.1 什么是类继承?

        继承允许您定义一个新类,该新类可以访问已定义的另一个类的方法和属性。具有将被另一个类继承的方法和属性的类称为父类。您可能遇到的父类的其他名称是基类和超类。能够访问父类的属性和方法的类称为子类。子类也称为子类。除了定义从现有类继承的类之外,还可以定义从多个父类继承的子类。 

 

2.2 如何创建子类

        子类继承父类的方法和属性。子类的其他名称是子类和派生类。子类可用于通过添加新方法和属性来扩展父类的功能。它还可用于覆盖或自定义父类。 

        子类是通过将父类作为参数传递给子类来定义的:

Class ChildClass(ParentClass):
def __init__(self):super().__iniit__(attribute)
def print_attribute(self):print(“attribute inherited from Parent Class:”, self.attribute)

 

2.3 如何创建父类

        父类具有由新子类继承的方法和属性。父类具有可以由子类覆盖或自定义的方法和属性。在Python中定义父类的方法很简单,就是定义一个带有方法和属性的类,就像通常定义一个普通的类一样。

        下面,我们定义一个简单的父类示例。该init方法是存在的,就像我们对普通类一样。在该init方法中,我们定义一个类属性并在该类属性中存储一些值。然后我们定义一个名为的类方法,print_attribute该方法打印该方法中定义的属性init

Class ParentClass:
def __init__(self, attribute):self.attribute = attribute
def print_attribute(self):print(Self.attribute)	

 

2.4 继承的好处

        继承非常强大,因为它允许开发人员限制代码重复。通过设计类的层次结构,您可以防止执行相同任务的重复代码行。这不仅使代码易于阅读,而且还显着提高了可维护性。例如,如果代码中有很多地方要计算模型预测的错误率,则可以将其重构为由子类继承的父类方法。 

        当层次类设计(继承)做得好时,它也使测试和调试变得更加容易。这是因为明确定义的任务将被本地化到代码库中的单个位置,因此当需要更改任务的完成方式时,找到需要更改的必要代码应该很简单。此外,一旦对父类中的方法进行更改,该更改就会传播到所有无关的子类。 

 

三、Python 中类继承的示例

      我们用于机器学习的许多包(例如Scikit-learn和Keras)都包含从父类继承的类。例如,线性回归、支持向量机和随机森林等类都是从称为 BaseEstimator 的父类继承的子类。基本估计器类包含大多数数据科学家应该熟悉的预测和拟合等方法。

        一个更有趣的应用是通过使用多个包来定义从 Python 中的父类继承的自定义子类。例如,您可以编写一个自定义 DataFrame 类作为继承自Pandas中的 DataFrame 类的子类。同样,您可以定义一个继承自父类RandomForestClassifier的自定义分类类。

        您还可以定义自定义父类和子类。例如,您可以定义指定特定类型分类模型的自定义父类和分析模型输出的子类。例如,您还可以编写父类和子类来进行模型预测数据可视化。父类可以指定分类模型的类型及其输入和输出的属性。然后,子类可以生成可视化效果(例如混淆矩阵)来分析模型输出。

        对于我们的分类模型,我们将使用虚构的 Telco 流失数据集,该数据集在 Kaggle 上公开提供。该数据集在Apache 2.0 License下可以免费使用、修改和共享 。

 

3.1 扩展 PYTHON 包中的现有类

我们首先将流失数据读入 Pandas 数据框:

import pandas as pd
df = pd.read_csv('telco_churn.csv')

接下来,让我们定义输入和输出。我们将使用 MonthlyCharges、Gender、Tenure、InternetService 和 OnlineSecurity 字段来预测流失率。让我们将分类列转换为机器可读的值:

df['gender'] = df['gender'].astype('category')
df['gender_cat'] = df['gender'].cat.codesdf['InternetService'] = df['InternetService'].astype('category')
df['InternetService_cat'] = df['InternetService'].cat.codesdf['OnlineSecurity'] = df['OnlineSecurity'].astype('category')
df['OnlineSecurity_cat'] = df['OnlineSecurity'].cat.codesdf['Churn'] = np.where(df['Churn']=='Yes', 1, 0)
cols = ['MonthlyCharges', 'tenure', 'gender_cat', 'InternetService_cat', 'OnlineSecurity_cat']

        接下来,让我们定义输入和输出:

from sklearn.model_selection import train_test_split
X = df[cols]
y = df['Churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

        现在我们可以定义我们的自定义子类。让我们从 Scikit-learn 导入随机森林分类器并定义一个名为 CustomClassifier 的空类。CustomClassifier 将采用 RandomForestClassifier 类作为参数:

from sklearn.ensemble import RandomForestClassifierclass CustomClassifier(RandomForestClassifier):pass

    test_size我们将在我们的方法中指定一个init,使我们能够指定测试和训练样本的大小。我们还将使用 super 方法来允许我们的自定义类继承随机森林类的方法和属性。这将使用任何其他自定义方法扩展父随机森林类。

from sklearn.ensemble import RandomForestClassifierclass CustomClassifier(RandomForestClassifier):def __init__(self, test_size=0.2, **kwargs):super().__init__(**kwargs)self.test_size = test_size

        现在我们将定义一种方法来分割数据以进行训练和测试:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_splitclass CustomClassifier(RandomForestClassifier):def __init__(self, test_size=0.2, **kwargs):super().__init__(**kwargs)self.test_size = test_sizedef split_data(self):self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(X, y, test_size=self.custom_param, random_state=42)

        接下来,我们可以定义类的实例。我们将为我们的 传递一个值 0.2 test_size。这意味着测试集将由 20% 的数据组成,训练集将由其余 80% 的数据组成:

rf_model = CustomClassifier(0.2)
rf_model.split_data()

        我们可以通过打印子类的属性和方法来了解我们的子类:

print(dir(rf_model))

        我们将看到,通过子类,我们拥有父随机森林对象可访问的所有方法和属性:

['__abstractmethods__', '__annotations__', '__class__',
'__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__',
'__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'_abc_impl', '_check_feature_names', '_check_n_features',
'_compute_oob_predictions', '_estimator_type', '_get_oob_predictions',
'_get_param_names', '_get_tags', '_make_estimator', '_more_tags',
'_repr_html_', '_repr_html_inner', '_repr_mimebundle_',
'_required_parameters', '_set_oob_score_and_attributes',
'_validate_X_predict', '_validate_data', '_validate_estimator',
'_validate_y_class_weight', 'apply', 'base_estimator', 'bootstrap',
'ccp_alpha', 'class_weight', 'criterion', 'decision_path',
'estimator_params', 'feature_importances_', 'fit', 'get_params',
'max_depth', 'max_features', 'max_leaf_nodes', 'max_samples',
'min_impurity_decrease', 'min_samples_leaf', 'min_samples_split',
'min_weight_fraction_leaf', 'n_estimators', 'n_features_', 'n_jobs',
'oob_score', 'predict', 'predict_log_proba', 'predict_proba',
'random_state', 'score', 'set_params', 'split_data', 'test_size',
'verbose', 'warm_start']

        为了表明我们的自定义子类实例可以访问父随机森林类的方法和属性,让我们尝试通过自定义类实例将随机森林模型拟合到我们的训练数据:

rf_model = CustomClassifier(0.2)
rf_model.split_data()
rf_model.fit(rf_model.X_train, rf_model.y_train)

        尽管我们正在调用属于外部类的方法,但该代码执行时没有错误。这就是Python继承的美妙之处!它允许您轻松扩展现有类的功能,无论它们是包的一部分还是自定义的。 

        除了方法之外,我们还可以访问随机森林分类器类属性。例如,特征重要性是随机森林分类器类的属性。让我们使用类实例访问并显示随机森林特征的重要性:

importances = dict(zip(rf_model.feature_names_in_, 
rf_model.feature_importances_))
print("Feature Importances: ", importances) 

        这给出了以下结果:

Feature Importances:  {'MonthlyCharges': 0.5192056776242303,'tenure': 0.3435083140171441,'gender_cat': 0.015069195786109523,'InternetService_cat': 0.0457071535620191,'OnlineSecurity_cat': 0.07650965901049701}

软件工程的更多内容如何使用GDB

 

3.2 扩展自定义父类

        Python 继承的另一个机器学习用例是使用子类扩展自定义父类功能。例如,我们可以定义一个训练随机森林模型的父类。然后,我们可以定义一个子类,它使用继承的测试集和预测属性生成混淆矩阵。 

        让我们首先定义将用于构建模型的类。对于此示例,我们将使用Seaborn库和度量模块中的混淆度量方法。我们还将训练集和测试集存储为父级的属性:

from sklearn.metrics import confusion_matrix
import seaborn as snsclass Model:def __init__(self):self.n_estimators = 10self.max_depth = 10self.y_test = y_testself.y_train = y_trainself.X_train = X_trainself.X_test = X_test

        接下来,我们可以定义一个拟合方法,将随机森林分类器适合我们的训练数据:

from sklearn.metrics import confusion_matrix
import seaborn as snsclass Model:...def fit(self):self.model = RandomForestClassifier(n_estimators = self.n_estimators, max_depth = self.max_depth, random_state=42)self.model.fit(self.X_train, self.y_train)

        最后,我们可以定义一个返回模型预测的预测方法:

from sklearn.metrics import confusion_matrix
import seaborn as snsclass Model:...def predict(self):self.y_pred = self.model.predict(X_test)return self.y_pred

        现在我们可以定义我们的子类了。我们将我们的子类命名为“ModelVisulaization”。这个类将继承我们的Model类的方法和属性:

class ModelVisualization(Model):def __init__(self):super().__init__()

        我们将通过添加生成混淆矩阵的方法来扩展我们的模型类:

class ModelVisualization(Model):def __init__(self):super().__init__()def generate_confusion_matrix(self):cm = confusion_matrix(self.y_test, self.y_pred)cm = cm / cm.astype(np.float).sum(axis=1)sns.heatmap(cm, annot=True, cmap='Blues')

        现在我们可以定义子类的实例并绘制混淆矩阵:

results = ModelVisualization()
results.fit()
results.predict()
results.generate_confusion_matrix()

        这会生成以下内容:

Seaborn 中的数据可视化

图片:屏幕截图。

        显然,如何设计自定义类有一定的自由度,无论它们是现有包中的类的子类还是其他自定义父类的子类。根据您的用例,一条路线可能比另一条路线更有意义。例如,如果您只想添加少量附加属性和方法,则扩展现有类可能更合适。如果需要定制大量任务,构建定制的父类和子类会更合适。 

      Python 类继承对于数据科学和机器学习任务非常有用。扩展现有机器学习包中的类的功能是一个常见的用例。虽然我们在这里介绍了扩展随机森林分类器类,但您还可以扩展 Pandas 数据帧类和数据转换类的功能,例如标准缩放器和最小最大缩放器。对于数据科学家和机器学习工程师来说,大致了解如何使用 Python 继承来扩展现有类非常有价值。

        此外,在某些情况下,属于不同工作流程的许多任务需要自定义。我们考虑了扩展自定义类的示例,我们使用该类来构建具有可视化功能的分类模型。这允许我们继承建模类的方法和属性,并在子类中生成可视化。

        这篇文章中的代码可以在 GitHub上找到。

相关文章:

Python 类继承解释

一、说明 类继承是Python中数据科学家和机器学习工程师需要了解的一个重要概念。在这里,我们的专家解释了它的工作原理。 在Python中,类包含属性和方法。属性是存储数据的变量。类方法是属于类的函数,通常对类属性执行一些逻辑。在本文中&…...

Reactor反应器模式

文章目录 一、单线程Reactor反应器模式二、多线程Reactor反应器模式 在Java的OIO编程中,最初和最原始的网络服务器程序使用一个while循环,不断地监听端口是否有新的连接,如果有就调用一个处理函数来处理。这种方法最大的问题就是如果前一个网…...

alibaba.fastjson的使用(六) -- JavaBean==》Json字符串、JSONObject、JSONArray

目录 1. JavaBean转 Json字符串 2. JavaBean转 JSONObject 3. List转JSONArray 在pom文件中引入依赖: <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.14</version></dependency&…...

uniapp 自定义导航栏

自定义导航栏 修改 pages.json 在 pages.json 中将 navigateionStyle 设为 custom 新建 systemInfo.js systemInfo.js 用来获取当前设备的机型系统信息&#xff0c;放在 common 目录下 /*** 此 js 文件管理关于当前设备的机型系统信息*/ const systemInfo function() {/***…...

查分小程序:一键查询成绩,班主任和家长的得力助手

作为一名老师&#xff0c;是否曾经为了让学生能够方便地查询成绩而烦恼&#xff1f;担心学生忘记密码&#xff1f;还是手动输入成绩太繁琐&#xff1f;今天&#xff0c;给大家分享一个超级实用的查分小程序&#xff0c;让成绩查询变得更轻松&#xff01; 什么是成绩查询系统&am…...

Linux内核驱动开发的步骤

Linux操作系统的内核是一个强大的、开源的操作系统内核&#xff0c;它为各种硬件设备提供支持。为了让硬件设备能够与Linux系统无缝协作&#xff0c;需要编写相应的内核驱动程序。本文将介绍Linux内核驱动开发的一般步骤&#xff0c;以帮助开发者了解如何创建自己的内核驱动。 …...

【Java 进阶篇】HTML DOM 事件详解

当用户在网页上点击按钮、输入文本、鼠标移动到某个区域或执行其他互动操作时&#xff0c;这些动作都可以触发事件。HTML DOM&#xff08;文档对象模型&#xff09;允许我们使用JavaScript来捕获、处理和响应这些事件&#xff0c;以实现网页的交互和动态性。本篇博客将围绕HTML…...

redis 从小白到大师系列

字符串 Redis 字符串数据类型 set 字符串 /*** 设置字符串*/ $t $redis->set(o1,o1); //返回true or false var_dump($t);get字符串 /*** 获取字符串*/ $t $redis->get(o1); //返回true or false var_dump($t);结果&#xff1a; string(2) “o1” 返回 key 中字符串…...

vue使用.filter方法检索数组中指定时间段内的数据

假设你有一个名为dataArray的数组&#xff0c;其中包含了你要筛选的数据。那么&#xff0c;你可以按照以下步骤进行筛选&#xff1a; 创建一个名为filteredArray的新数组&#xff0c;用于存储筛选后的结果。使用数组的filter方法遍历dataArray&#xff0c;并对每个元素应用筛选…...

Ubuntu 安装 npm 和 node

前言 最近学习VUE&#xff0c;在ubuntu 2204 上配置开发环境&#xff0c;涉及到npm node nodejs vue-Cli脚手架等内容&#xff0c;做以记录。 一、node nodejs npm nvm 区别 &#xff1f; node 是框架&#xff0c;类似python的解释器。nodejs 是编程语言&#xff0c;是js语言的…...

Matlab论文插图绘制模板第122期—函数折线图(fplot)

本期分享的是函数折线图的绘制模板。​ 所谓函数折线图&#xff0c;就是将自定义线函数进行可视化表达​。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需要的朋友可以关注同名公号【阿昆的…...

IK分词器如何修改支持跨版本ES

一、问题描述&#xff1a;IK分词器版本和ES版本不一致&#xff0c;无法找到和自己ES版本匹配的分词器。 IK分词器&#xff0c;提供的插件版本&#xff0c;远赶不上ES的更新版本&#xff0c;在使用过程中&#xff0c;不一定能顺利的找到与自己使用的ES版本相对应。在ES集群中使用…...

Spring MVC常用十大注解

Spring MVC常用十大注解 一&#xff0c;什么要使用注解 使用注解可以简化配置&#xff0c;提高代码的可读性和可维护性。通过注解可以实现依赖注入&#xff0c;减少手动管理对象的代码量。注解还支持面向切面编程&#xff0c;实现切面、切入点和通知等。此外&#xff0c;注解提…...

二、【MyBatis】 MyBatis入门与简单使用

二、【MyBatis】 MyBatis入门与简单使用 二、【MyBatis】 MyBatis入门与简单使用一、什么是ORM二、为什么mybatis是半自动的ORM框架2.1 Hibernate优点2.2 Hibernate缺点2.3 MyBatis与Hibernate区别三、Mybatis快速入门3.1 项目引入Maven相关依赖3.2 创建测试数据库3.3 编写数据…...

基于DF模式的协作通信技术matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DF概述 4.2、DF基本原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2013b 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd))…...

Angular-01:基本架构

各种学习后的知识点整理归纳&#xff0c;非原创&#xff01; ① 概述 angular是一个使用HTML、CSS、TypeScript构建的客户端应用的框架&#xff0c;用来构建单页面应用程序。是一个重量级的框架&#xff0c;内部集成了大量开箱即用的功能模块。是为大型应用开发而设计&#xf…...

字符串划分

题目描述 给定一个小写字母组成的字符串s&#xff0c;请找出字符串中两个不同位置的字符作为分割点&#xff0c;使得字符串分成的三个连续子串且子串权重相等&#xff0c;注意子串不包含分割点。 若能找到满足条件的两个分割点&#xff0c;请输出这两个分割点在字符串中的位置…...

ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found的解决方法

导致该错误的原因&#xff1a;gcc动态库版本太老了 解决方法&#xff1a; 1、编辑~/.bash_profile vim ~/.bash_profile 2、将anaconda3/lib的路径加入库文件的路径 LD_LIBRARY_PATH/your_path/anaconda3/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH 3、重载~/.bash_pr…...

华为云全新上线Serverless应用中心,支持一键构建文生图应用

近日&#xff0c;华为云全新上线Serverless应用中心&#xff0c;提供了大量应用模板&#xff0c;让用户能够一键部署函数和周边依赖资源&#xff0c;节省部署时间&#xff0c;快速上手将应用部署到华为云函数计算FunctionGraph&#xff0c;并一键开通周边依赖资源。 本次Serve…...

scrapy的安装和使用

一、scrapy是什么&#xff1a;Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;可以应用在包括数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序 二、scrapy的安装&#xff1a;pip install scrapy -i https://pypi.douban.com/…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...