GINI指数计算

GINI系数的计算

题目在这里插入图片描述

1、计算整个训练集的基尼指数
2、计算训练集按照“性别”进行两路分割后的基尼指数
3、计算训练集按照“车型”进行三路分割后的基尼指数
4、(5) 计算训练集按照“衬衣尺码”进行四路分割后的基尼指数

思路

利用结构体和函数求解

代码

// A code block
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

struct people           //建立结构体存放每一元组的数据
{
    int id;
    char sex;
    string car_type;
    string shirt_size;
    int pclass;
};


int main()
{
    int n;
    people *p;
    cin>>n;
    people person[n];                            //
    p=person;
    void whole(int n,people *p);                //计算整个训练集的GINI指数
    void ssex(int n,people *p);                 //计算性别的GINI指数
    void car_typefunc(int n,people *p);         //计算车型的GINI指数
    void shirt_sizefunc(int n,people *p);       //计算衬衣尺码的GINI指数
    for(int i=0;i<n;i++)
    {
        person[i].id=i+1;
        cin>>person[i].sex>>person[i].car_type>>person[i].shirt_size>>person[i].pclass;
    }
    whole(n,p);
    ssex(n,p);
    car_typefunc(n,p);
    shirt_sizefunc(n,p);
    return 0;
}


void whole(int n,people *p)
{
    float a,b;
    a=b=0;
    for(int i=0;i<n;i++)
    {
        if((p+i)->sex=='M'||(p+i)->sex=='m') a++;           //统计性别为男的个数
        else b++;                                           //统计性别为女的个数
    }
    a/=(float)n;b/=(float)n;a*=a;b*=b;                     //代入公式计算
    cout<<"整个训练集的基尼指数为:"<<1-a-b<<endl;
}

int c0_count(int n,people *p)                               //计算c0类个数
{
    int c0=0;
    for(int i=0;i<n;i++)
    {
        if((p+i)->pclass==0) c0++;
    }
    return c0;
}

void ssex(int n,people *p)
{
    float a1,a2,b1,b2,m,f,mg,fg,g;                          //a1、a2存放性别为男的在c0、c1中的个数,之后同理
    int c0_count(int n,people *p);
    int c0=c0_count(n,p);
    int c1=n-c0;
    a1=a2=b1=b2=0;
    for(int i=0;i<c0;i++)
    {
        if((p+i)->sex=='m'||(p+i)->sex=='M') a1++;
        else b1++;
    }
    for(int i=0;i<c1;i++)
    {
        if((p+c0+i)->sex=='m'||(p+c0+i)->sex=='M') a2++;    //这边要注意c1在c0之后所以要记得加上一个c0的个数
        else b2++;
    }
    m=a1+a2;f=b1+b2;
    a1/=(float)m;b1/=(float)n;a2/=(float)m;b2/=(float)n;a1*=a1;a2*=a2;b1*=b1;b2*=b2;
    m/=(float)n;f/=(float)n;
    mg=1-a1-a2;
    fg=1-b1-b2;
    cout<<"Male GINI is "<<mg<<endl;
    cout<<"Female GINI is "<<fg<<endl;
    g=m*mg+(f*fg);
    cout<<"Gender GINI is "<<g<<endl;
}

void car_typefunc(int n,people *p)
{
    int c0_count(int n,people *p);
    int c0=c0_count(n,p);
    int c1=n-c0;
    float a1,b1,d1,a2,b2,d2,f,s,l,fg,sg,lg,g;
    a1=b1=d1=a2=b2=d2=0;
    for(int i=0;i<c0;i++)
    {
        if((p+i)->car_type=="family") a1++;
        else if((p+i)->car_type=="sports") b1++;
        else d1++;
    }
    for(int i=0;i<c1;i++)
    {
        if((p+c0+i)->car_type=="family") a2++;
        else if((p+c0+i)->car_type=="sports") b2++;
        else d2++;
    }
    f=a1+a2;s=b1+b2;l=d1+d2;
    a1/=(float)f;b1/=(float)s;d1/=(float)l;a2/=(float)f;b2/=(float)s;d2/=(float)l;a1*=a1;b1*=b1;d1*=d1;a2*=a2;b2*=b2;d2*=d2;
    f/=(float)n;s/=(float)n;l/=(float)n;
    fg=1-a1-a2;
    sg=1-b1-b2;
    lg=1-d1-d2;
    cout<<"Family GINI is "<<fg<<endl;
    cout<<"Sports GINI is "<<sg<<endl;
    cout<<"Luxury GINI is "<<lg<<endl;
    g=f*fg+(s*sg)+(l*lg);
    cout<<"Car Type GINI is "<<g<<endl;
}

void shirt_sizefunc(int n,people *p)
{
    int c0_count(int n,people *p);
    int c0=c0_count(n,p);
    int c1=n-c0;
    float a1,b1,d1,e1,a2,b2,d2,e2,s,m,l,e,sg,mg,lg,eg,g;
    a1=b1=d1=e1=a2=b2=d2=e2=0;
    for(int i=0;i<c0;i++)
    {
        if((p+i)->shirt_size=="small") a1++;
        else if((p+i)->shirt_size=="medium") b1++;
        else if((p+i)->shirt_size=="large") d1++;
        else e1++;
    }
    for(int i=0;i<c1;i++)
    {
        if((p+c0+i)->shirt_size=="small") a2++;
        else if((p+c0+i)->shirt_size=="medium") b2++;
        else if((p+c0+i)->shirt_size=="large") d2++;
        else e2++;
    }
    s=a1+a2;m=b1+b2;l=d1+d2;e=e1+e2;
    a1/=(float)s;b1/=(float)m;d1/=(float)l;e1/=(float)e;a2/=(float)s;b2/=(float)m;d2/=(float)l;e2/=(float)e;a1*=a1;b1*=b1;d1*=d1;e1*=e1;a2*=a2;b2*=b2;d2*=d2;e2*=e2;
    s/=(float)n;m/=(float)n;l/=(float)n;e/=(float)n;
    sg=1-a1-a2;
    mg=1-b1-b2;
    lg=1-d1-d2;
    eg=1-e1-e2;
    cout<<"Small GINI is "<<sg<<endl;
    cout<<"Medium GINI is "<<mg<<endl;
    cout<<"Large GINI is "<<lg<<endl;
    cout<<"Extra Large GINI is "<<eg<<endl;
    g=s*sg+(m*mg)+(l*lg)+(e*eg);
    cout<<"Shirt Size GINI is "<<g<<endl;
}


  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gini指数是一种常用的判断决策树节点拆分质量的指标。在决策树的构建过程中,可以通过计算该指标来选择最佳的节点划分属性。与此同时,通过预剪枝方法来增加决策树的剪枝,减少模型的过拟合。 预剪枝是指在决策树的构建过程中,在划分一个节点之前,先对划分所得的子节点进行估计,检查该节点是否满足停止条件,如果不满足则停止划分,将该节点标记为叶子节点,并进行剪枝。在采用Gini指数预剪枝时,可以通过计算每一次划分后的Gini指数值的变化,来判断是否进行剪枝。 具体来说,可以在构建决策树的过程中,对每个节点计算划分前后的Gini指数的变化值,即原节点的Gini指数减去子节点的加权平均Gini指数。如果这个变化值小于某个阈值,那么就认为预剪枝是合理的,可以停止进一步划分,进行剪枝操作。 采用Gini指数预剪枝的优点是可以加快决策树的构建速度,并且防止了模型的过拟合。过拟合是指模型过于复杂,过度拟合了训练数据,导致在新的测试数据上性能下降。采用预剪枝可以限制决策树的增长,避免了过拟合的问题,提高了模型的泛化能力。 然而,Gini指数预剪枝的缺点是在剪枝操作中可能会过早停止划分,导致决策树的准确性下降。因此,在实际应用中,需要通过交叉验证等方法来确定最佳的阈值,以平衡剪枝和准确性之间的关系。同时,也可以尝试其他的剪枝策略,如后剪枝方法,进一步改进决策树的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值