随机森林(Random Forest)通俗教程

目录

  • 1 什么是随机森林?
  • 2 随机森林的特点
  • 3 随机森林的相关基础知识
  • 4 随机森林的生成
  • 5 袋外错误率(oob error)
  • 6 随机森林工作原理解释的一个简单例子
  • 7 随机森林的Python实现
  • 8 参考内容

1 什么是随机森林?

  作为新兴起的、高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。最初,我是在参加校外竞赛时接触到随机森林算法的。最近几年的国内外大赛,包括2013年百度校园电影推荐系统大赛、2014年阿里巴巴天池大数据竞赛以及Kaggle数据科学竞赛,参赛者对随机森林的使用占有相当高的比例。此外,据我的个人了解来看,一大部分成功进入答辩的队伍也都选择了Random Forest 或者 GBDT 算法。所以可以看出,Random Forest在准确率方面还是相当有优势的。

  那说了这么多,那随机森林到底是怎样的一种算法呢?

  如果读者接触过决策树(Decision Tree)的话,那么会很容易理解什么是随机森林。随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,其实这也是随机森林的主要思想--集成思想的体现。“随机”的含义我们会在下边部分讲到。

  其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

2 随机森林的特点

  我们前边提到,随机森林是一种很灵活实用的方法,它有如下几个特点:

  • 在当前所有算法中,具有极好的准确率/It is unexcelled in accuracy among current algorithms;
  • 能够有效地运行在大数据集上/It runs efficiently on large data bases;
  • 能够处理具有高维特征的输入样本,而且不需要降维/It can handle thousands of input variables without variable deletion;
  • 能够评估各个特征在分类问题上的重要性/It gives estimates of what variables are important in the classification;
  • 在生成过程中,能够获取到内部生成误差的一种无偏估计/It generates an internal unbiased estimate of the generalization error as the forest building progresses;
  • 对于缺省值问题也能够获得很好得结果/It has an effective method for estimating missing data and maintains accuracy when a large proportion of the data are missing
  • ... ...

  实际上,随机森林的特点不只有这六点,它就相当于机器学习领域的Leatherman(多面手),你几乎可以把任何东西扔进去,它基本上都是可供使用的。在估计推断映射方面特别好用,以致都不需要像SVM那样做很多参数的调试。具体的随机森林介绍可以参见随机森林主页:Random Forest。

3 随机森林的相关基础知识

  随机森林看起来是很好理解,但是要完全搞明白它的工作原理,需要很多机器学习方面相关的基础知识。在本文中,我们简单谈一下,而不逐一进行赘述,如果有同学不太了解相关的知识,可以参阅其他博友的一些相关博文或者文献。

  1)信息、熵以及信息增益的概念

  这三个基本概念是决策树的根本,是决策树利用特征来分类时,确定特征选取顺序的依据。理解了它们,决策树你也就了解了大概。

  引用香农的话来说,信息是用来消除随机不确定性的东西。当然这句话虽然经典,但是还是很难去搞明白这种东西到底是个什么样,可能在不同的地方来说,指的东西又不一样。对于机器学习中的决策树而言,如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息可以定义如下:

  I(x)用来表示随机变量的信息,p(xi)指是当xi发生时的概率。

  熵是用来度量不确定性的,当熵越大,X=xi的不确定性越大,反之越小。对于机器学习中的分类问题而言,熵越大即这个类别的不确定性更大,反之越小。

  信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好。

  这方面的内容不再细述,感兴趣的同学可以看 信息&熵&信息增益 这篇博文。

  2)决策树

  决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。常见的决策树算法有C4.5、ID3和CART。

  3)集成学习 

  集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。

  随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。你可以在这找到用python实现集成学习的文档:Scikit 学习文档。

4 随机森林的生成

  前面提到,随机森林中有许多的分类树。我们要将一个输入样本进行分类,我们需要将输入样本输入到每棵树中进行分类。打个形象的比喻:森林中召开会议,讨论某个动物到底是老鼠还是松鼠,每棵树都要独立地发表自己对这个问题的看法,也就是每棵树都要投票。该动物到底是老鼠还是松鼠,要依据投票情况来确定,获得票数最多的类别就是森林的分类结果。森林中的每棵树都是独立的,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随机森林bagging的思想(关于bagging的一个有必要提及的问题:bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。)。下图可以形象地描述这个情况:

 

  有了树我们就可以分类了,但是森林中的每棵树是怎么生成的呢?

  每棵树的按照如下规则生成:

  1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;

  从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。

  为什么要随机抽样训练集?(add @2016.05.28)

  如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;

  为什么要有放回地抽样?(add @2016.05.28)

  我理解的是这样的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。

  2)如果每个样本的特征维度为M,指定一个常数m<<M随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;

  3)每棵树都尽最大程度的生长,并且没有剪枝过程

  一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。

  随机森林分类效果(错误率)与两个因素有关:

  • 森林中任意两棵树的相关性:相关性越大,错误率越大;
  • 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。

  减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

5 袋外错误率(oob error)

  上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。

  随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。

  我们知道,在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例没有参与第k棵树的生成,它们称为第k棵树的oob样本。

  而这样的采样特点就允许我们进行oob估计,它的计算方式如下:

  (note:以样本为单位)

  1)对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);

  2)然后以简单多数投票作为该样本的分类结果;

  3)最后用误分个数占样本总数的比率作为随机森林的oob误分率。

  (文献原文:Put each case left out in the construction of the kth tree down the kth tree to get a classification. In this way, a test set classification is obtained for each case in about one-third of the trees. At the end of the run, take j to be the class that got most of the votes every time case n was oob. The proportion of times that j is not equal to the true class of n averaged over all cases is the oob error estimate. This has proven to be unbiased in many tests.)

  oob误分率是随机森林泛化误差的一个无偏估计,它的结果近似于需要大量计算的k折交叉验证。

回到顶部

6 随机森林工作原理解释的一个简单例子

  描述:根据已有的训练集已经生成了对应的随机森林,随机森林如何利用某一个人的年龄(Age)、性别(Gender)、教育情况(Highest Educational Qualification)、工作领域(Industry)以及住宅地(Residence)共5个字段来预测他的收入层次。

  收入层次 :

    Band 1 : Below $40,000

    Band 2: $40,000 – 150,000

    Band 3: More than $150,000

  随机森林中每一棵树都可以看做是一棵CART(分类回归树),这里假设森林中有5棵CART树,总特征个数N=5,我们取m=1(这里假设每个CART树对应一个不同的特征)。

  CART 1 : Variable Age

  rf1

  CART 2 : Variable Gender

  rf2

  CART 3 : Variable Education

  rf3

  CART 4 : Variable Residence

  rf4

  CART 5 : Variable Industry

  rf5

  我们要预测的某个人的信息如下:

  1. Age : 35 years ; 2. Gender : Male ; 3. Highest Educational Qualification : Diploma holder; 4. Industry : Manufacturing; 5. Residence : Metro.

  根据这五棵CART树的分类结果,我们可以针对这个人的信息建立收入层次的分布情况:

  DF

  最后,我们得出结论,这个人的收入层次70%是一等,大约24%为二等,6%为三等,所以最终认定该人属于一等收入层次(小于$40,000)。

回到顶部

7 随机森林的Python实现

  利用Python的两个模块,分别为pandas和scikit-learn来实现随机森林。

复制代码
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as npiris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Factor(iris.target, iris.target_names)
df.head()train, test = df[df['is_train']==True], df[df['is_train']==False]features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])
复制代码

  分类结果:

  

  与其他机器学习分类算法进行对比:

复制代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.lda import LDA
from sklearn.qda import QDAh = .02  # step size in the meshnames = ["Nearest Neighbors", "Linear SVM", "RBF SVM", "Decision Tree","Random Forest", "AdaBoost", "Naive Bayes", "LDA", "QDA"]
classifiers = [KNeighborsClassifier(3),SVC(kernel="linear", C=0.025),SVC(gamma=2, C=1),DecisionTreeClassifier(max_depth=5),RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1),AdaBoostClassifier(),GaussianNB(),LDA(),QDA()]X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,random_state=1, n_clusters_per_class=1)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)datasets = [make_moons(noise=0.3, random_state=0),make_circles(noise=0.2, factor=0.5, random_state=1),linearly_separable]figure = plt.figure(figsize=(27, 9))
i = 1
# iterate over datasets
for ds in datasets:# preprocess dataset, split into training and test partX, y = dsX = StandardScaler().fit_transform(X)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4)x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))# just plot the dataset firstcm = plt.cm.RdBucm_bright = ListedColormap(['#FF0000', '#0000FF'])ax = plt.subplot(len(datasets), len(classifiers) + 1, i)# Plot the training pointsax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)# and testing pointsax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6)ax.set_xlim(xx.min(), xx.max())ax.set_ylim(yy.min(), yy.max())ax.set_xticks(())ax.set_yticks(())i += 1# iterate over classifiersfor name, clf in zip(names, classifiers):ax = plt.subplot(len(datasets), len(classifiers) + 1, i)clf.fit(X_train, y_train)score = clf.score(X_test, y_test)# Plot the decision boundary. For that, we will assign a color to each# point in the mesh [x_min, m_max]x[y_min, y_max].if hasattr(clf, "decision_function"):Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])else:Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]# Put the result into a color plotZ = Z.reshape(xx.shape)ax.contourf(xx, yy, Z, cmap=cm, alpha=.8)# Plot also the training pointsax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)# and testing pointsax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,alpha=0.6)ax.set_xlim(xx.min(), xx.max())ax.set_ylim(yy.min(), yy.max())ax.set_xticks(())ax.set_yticks(())ax.set_title(name)ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),size=15, horizontalalignment='right')i += 1figure.subplots_adjust(left=.02, right=.98)
plt.show()
复制代码

  这里随机生成了三个样本集,分割面近似为月形、圆形和线形的。我们可以重点对比一下决策树和随机森林对样本空间的分割:

  1)从准确率上可以看出,随机森林在这三个测试集上都要优于单棵决策树,90%>85%,82%>80%,95%=95%;

  2)从特征空间上直观地可以看出,随机森林比决策树拥有更强的分割能力(非线性拟合能力)。

  更多有关随机森林的代码:

总结

随机森林是一个比较优秀的模型,在我的项目的使用效果上来看,它对于多维特征的数据集分类有很高的效率,还可以做特征重要性的选择。运行效率和准确率较高,实现起来也比较简单。但是在数据噪音比较大的情况下会过拟合,过拟合的缺点对于随机森林来说还是较为致命的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加密流量分类-论文9:DarknetSec: A novel self-attentive deep learning method for darknet traffic.....

加密流量分类-论文9&#xff1a;DarknetSec: A novel self-attentive deep learning method for darknet traffic classification and application identification 0、摘要1、文章核心观点引入2、模型结构2.1 模型总览2.2 预处理层2.4 特征提取层 4、实验5、总结与思考 0、摘要…

陌陌X-SIGN算法HOOK

文章目录 前言应用到的工具java 层分析frida hook aesEncode&#xff0c;a&#xff0c;sign 这三个方法总结预告&#xff1a; 下章节我们讲&#xff1a;陌陌X-SIGN还原 前言 学习是必然的&#xff0c;一路并不是平台的到道路&#xff0c;总要有点意外和惊喜。人嘛&#xff01;…

152.网络安全渗透测试—[Cobalt Strike系列]—[会话管理/派生]

我认为&#xff0c;无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感&#xff01;&#xff01;&#xff01; 文章目录 一、会话管理1、实验环境2、会话派生&#xff08;1&#xff09;128的cs会话派生给128的cs本身&#xff08;2&#xff09;128的cs会话派生给…

森林攻略

1.存档攻略 C盘/ Users / Administrator / AppData / LocalLow / SKS / The forest / 一列数字 你保存的存档&#xff0c;就在那个名称全是数字的文件夹中&#xff0c;只需把其中的存档文件保存在U盘或网盘中&#xff0c;下次玩时&#xff0c;把保存的存档文件放到存档文件夹…

Isolation Forest孤立森林(二)之sklearn实现,源码分析

孤立森林算法sklearn实现,源码分析 算法一&#xff1a; 首先初始化一些参数 class sklearn.ensemble.IsolationForest(n_estimators100, max_samples’auto’, contamination’legacy’, max_features1.0, bootstrapFalse, n_jobsNone, behaviour’old’, random_stateNone, v…

森林图

森林图 以统计指标和统计分析方法为基础&#xff0c;用数值计算绘制出的图形&#xff0c;通常是在平面直角坐标系中&#xff0c;以一条垂直的无效 线&#xff08;0或者1&#xff09;为中心&#xff0c;用平衡于x轴的多条线段描述每个组指标的中值和可信区间&#xff0c;最后一…

BFT 最前线 | 互联网惊现 AI 鬼城,中国电信天翼云将发布预训练大模型,周鸿祎谈“万模大战”

文 | BFT机器人 01 网易CEO 丁磊&#xff1a;人工智能价值已被引导到生产第一线 网易数帆推出 CodeWave 智能开发平台。据了解&#xff0c;网易数帆结合自身产品的定位&#xff0c;面向智能编程垂直领域推出大模型&#xff0c;并接入到智能开发平台中。网易 CEO 丁磊表示&…

竞逐对话式AI,百度、字节各有千秋

随着OpenAI陆续发布的ChatGPT引发了AI界热议&#xff0c;新一代的AI热度便开始持续走高。与此同时&#xff0c;以ChatGPT模型为代表的大型预训练模型的出现&#xff0c;也使得对话式AI的生成能力和智能水平得到了飞跃式的提升&#xff0c;得益于此&#xff0c;对话式AI的发展又…

老罗的聊天宝,Low的另一面

昨天3款社交APP在同一天开发布会&#xff0c;而老罗的聊天宝是最不被看好的哪一个。 聊天宝这款产品在朋友圈不少人说low得不行&#xff0c;名字浓浓的山寨气息&#xff0c;icon 更不用说&#xff0c;一个金灿灿的元宝&#xff0c;我也觉得它low。 感觉时空穿越&#xff0c;没有…

专访罗升阳:老罗的Android之旅

【http://www.csdn.net/article/2014-08-15/2821226】 专访罗升阳&#xff1a;老罗的Android之旅 发表于 2014-08-15 14:13| 2098次阅读| 来源 CSDN| 8 条评论| 作者 钱曙光 社区问答 访谈 罗升阳 Android Framework Java 操作系统 allowtransparency"true" frameb…

小红书内测淘宝外链,小红书商业化布局加速?!

临近双十一之际&#xff0c;小红书显得格外活跃。一个新的流量风口即将出现&#xff0c;小红书品牌商家会面临怎样的机遇和挑战呢&#xff1f; ▌淘宝外链从直播间到种草笔记 早在今年8月&#xff0c;小红书头部达人“爱臭美的狗甜儿”&#xff08;小红书粉丝167万&#xff0…

人工智能 charGPT 机器学习 算力 技术相关(对于常用框架、库、技术)等名词的解释收集整理和自我理解

人工智能 Artificial Intelligence 已经上升到国家战略层面&#xff0c;早在2017年国务院就印发了《新一代人工智能规划》 还有新基建中信息基础设施建设所包含的数据中心&#xff0c;智能中心等算计设施。 包括&#xff0c;图像识别&#xff0c;语音识别&#xff0c;自然语言…

【Qt快速扫盲】QT概述_GUI程序创建_基础知识点等

目录一、Qt概述二、基于Qt创建GUI程序&#xff08;对应P1-P12&#xff09;三、基础知识点&#xff08;对应P13-P28&#xff09;3.1 Qt专门数据类型3.2 日志输出3.3 字符串类及其相关方法3.4 QVariant类3.5 坐标类QPoint3.6 直线类QLine3.7 直线类QLine3.8 矩形类QRect3.9 日期类…

【Qt】第一、二章:Qt Creator介绍及Hello World程序示例

SDAU学子一枚&#xff0c;从此开始了进行关于Qt的总结复习。 第一章 Qt是一个多平台的C图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。其中包括了高级C代码编辑器、项目和生成管理工具、集成的上下文相关的帮助系统、图形化调试…

Qt 5框架介绍

该文章原创于Qter开源社区&#xff08;www.qter.org&#xff09;&#xff0c;作者 yafeilinux&#xff0c;转载请注明出处&#xff01; 一、在帮助中查看所有模块 打开 Qt Creator&#xff0c;进入其帮助模式&#xff0c;然后选择目录方式进行查看&#xff0c;打开 “Qt 5.2.…

Qt学习笔记(三十):Qt 中的绘图

一、QPainter&#xff1a;绘图对象 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于 QPainter&#xff0c;QPainterDevice 和 QPaintEngine 三个类。 QPainter 用来执行绘制的操作&#xff08;相当于画家&#xff09;&#xff1b; QPain…

【Qt入门第16篇】 2D绘图(六)坐标系统

导语 前面一节我们讲解了图片的显示&#xff0c;其中很多地方都用到了坐标的变化。这一节我们将讲解Qt的坐标系统&#xff0c;分为两部分来讲解&#xff1a;第一部分主要讲解前面一节的那几个函数&#xff0c;它们分别是translate()平移变换、scale()比例变换、rotate()旋转变…

使用Qt进行程序开发的过程记录

目录 一、qt的安装 二、resources文件的使用 三、Qt中各种设置问题 四、在子页面的简单图表显示 五、Qt发布独立运行的exe的方法 六、Qt创建子页面的方法 七、Qt中使用菜单栏的方法 八、Qt联合C进行文件读取、写入操作 九、Qt关闭窗口函数 十、提示窗口与调试功能的使…

Qt开发技术:Qt绘图系统(二)QPainter详解

若该文为原创文章&#xff0c;未经允许不得转载 原博主博客地址&#xff1a;https://blog.csdn.net/qq21497936 原博主博客导航&#xff1a;https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/…

Qt绘图与信号事件

Qt应用开发的基本模式(面向对象) 继承QDailog gkdialog.h #ifndef GK_DIALOG_H #define GK_DIALOG_H #include <QtWidgets/QDialog>class GKDialog: public QDialog{ public:GKDialog(QWidget *parent0);~GKDialog(); }; #endifgkdialog.cpp #include "gkdialog…