Python 类继承解释

news2024/11/20 2:22:32

 一、说明

        类继承是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.codes

df['InternetService'] = df['InternetService'].astype('category')
df['InternetService_cat'] = df['InternetService'].cat.codes

df['OnlineSecurity'] = df['OnlineSecurity'].astype('category')
df['OnlineSecurity_cat'] = df['OnlineSecurity'].cat.codes

df['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 RandomForestClassifier

class CustomClassifier(RandomForestClassifier):
   pass

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

from sklearn.ensemble import RandomForestClassifier

class 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_split

class CustomClassifier(RandomForestClassifier):
   def __init__(self, test_size=0.2, **kwargs):
       super().__init__(**kwargs)
       self.test_size = test_size
      
   def 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 sns

class Model:
   def __init__(self):
       self.n_estimators = 10
       self.max_depth = 10
       self.y_test = y_test
       self.y_train = y_train
       self.X_train = X_train
       self.X_test = X_test

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

from sklearn.metrics import confusion_matrix
import seaborn as sns

class 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 sns

class 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上找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1124350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm版本错误——npm ERR! code ERESOLVE 解决方法

起因 项目中echart版本过低,导致某些图表不能正确显示,所以大手一挥,将echart版本从4升级到了5, 再去运行项目的时候 就发现项目报错了 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! …

C++基础算法----正整数高精度加减乘除

4、正整数高精度 ​ 出现高精度的情况一般只有C会出现,python会无限制,java有大整数,所以基本上不用考虑,一般会出现四种情况 一个较大数A 一个较大数B一个较大数A - 一个较大数B一个较大数A * 一个数一个较大数A / 一个数 这里…

ubuntu系统由于英伟达显卡驱动问题黑屏或者其他报错开机无法进入系统解决办法!

背景: 硬件:CPU:AMD PRO 3955WX、硬盘:一块固态(ubuntu)一块固态(windows)双系统、英伟达丽台RTX4000显卡; 故障: 把显卡拆出来,拿到别的地方测…

分享一下商城小程序有哪些营销活动可以做的

随着移动支付的普及和电商行业的快速发展,商城小程序已成为消费者日常生活中不可或缺的一部分。小程序具有便捷性、即时性和个性化等特点,使得品牌商家能够更好地与消费者互动,提升销售额。本文将探讨商城小程序营销活动的几种形式&#xff0…

CentOS7日志文件及journalctl日志查看

一、日 志 文 件 说 明 tail /var/log/messages //系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 tail -f /var/log/secure //与安全相关的日志信息 tail /var/log/maillog //与邮件相关的日志信息 tail /var/log/cro…

8.canvas阴影设置

在canvas里面设置元素阴影相对来说比较简单,他有4个属性控制。 shadowOffsetX 描述阴影水平偏移距离的属性。 shadowOffsetY 描述阴影垂直偏移距离的属性。 shadowBlur 描述模糊效果程度的属性;它既不对应像素值也不受当前转换矩阵的影响。默认值是…

Python + Appium 自动化操作微信入门看这一篇就够了!

简介 Appium 是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium,能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令&#…

Anaconda创建新的虚拟环境及Jupyter Notebok中、PyCharm中环境的使用

Anaconda创建新的虚拟环境 在windows开始菜单中【徽标键】,查找Anaconda文件夹并打开【Anaconda Prompt】 查看已有虚拟环境 conda env list1.创建 conda create --name mytest python3.7 # 创建一个名称为mytest,python版本为3.7的虚拟环境输入【…

【已解决】Word文档的“打开密码”在哪里设置?

我们知道,Word文档可以设置“打开密码”,保护文件不被随意打开,只有输入正确的密码才能打开文档。那这个“打开密码”要在哪里设置呢?不清楚的小伙伴往下看就知道啦。 在Word文档里,有两个路径可以设置“打开密码”。…

Activiti

文章目录 一、Activiti介绍(一)BPM(一)BPM软件(一)BPMN(一)使用步骤1、部署activiti2、流程定义2、流程定义部署2、启动一个流程实例2、用户查询待办任务2、用户办理任务2、流程结束…

文本生成图像工作简述5--对条件变量进行增强的 T2I 方法(基于辅助信息的文本生成图像)

目录 一、基于场景图的文本生成图像二、基于对话的文本生成图像三、基于属性驱动的文本生成图像四、基于边界框标注的文本生成图像五、基于关键点的文本生成图像六、其他基于辅助信息的文本生成图像 在传统的T2I方法中,常常使用一个固定的随机噪声向量作为输入&…

极智嘉(Geek+)柔性货箱到人拣选方案,助力Starlinks实现高效运营

近些年,电商业务席卷全球,一众企业蓬勃发展。比如沙特阿拉伯先进的物流与供应链解决方案供应商Starlinks的电子商务的销售额从6%增长到了23%。为满足日益增长的国际电商业务需求,以及订单交付时效性更高的要求,Starlinks与全球仓储…

中国人民大学与加拿大女王大学金融硕士——另辟蹊径往往能带来柳暗花明

莎士比亚曾说过,人生就是一部作品,谁有生活理想和实现的计划,谁就有好的情结和结尾,谁便能写得十分精彩和引人注目。人生之路,道阻且长。做好自己的规划,方能行稳致远。金融领域的你有计划在职读研&#xf…

双系统,grub系统选择界面字体大小调整!

背景: winodwsubuntu双系统,grub系统选择界面字体太小了,尤其是4K分辨率屏幕,影响观感,想要字体变大。 方法: 设置grub配置文件中的屏幕分辨率, 分辨率调小,字体就会变大&#xff…

formData对象打印不出来

用el-upload上传图片 以流的形式传给后台 所以用formData对象带数据 let formData new FormData() formData.append(name,monkey7) console.log(formData) 明明已经把数据append进去了 console.log在控制台却打印不出 后来发现他得用formData.get("xxx"…

【unity3D】Scroll Rect组件—制作下滑列表

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的Scroll Rect组件 Scroll Rect组件 基础知识详细说明案例演示——制作一个简单的下滑框扩展 介绍:Scroll Rect组件是用…

如何搭建开源ERP平台Odoo并实现公网远程访问?——“cpolar内网穿透”

文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…

如何在Potplayer中使用公网访问群晖WebDav?

文章目录 1 使用环境要求:2 配置webdav3 测试局域网使用potplayer访问webdav4 内网穿透,映射至公网5 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内容让人一言难尽,就算是购买了国外的优秀作品,也总是在关键剧情上删删…

[答疑]QQ泡妞序列图上的参数名称对吗?

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2023-10-11 14:18 潘老师,这两个画圈的地方对吗? 还有,这里有“邮件附件”,是否可以改为“活动计划”呢? UMLChin…

【会议征稿通知】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)

2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024) 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议(NNICE 2024&#xff0…