关于模型泛化性的问题?

**关于模型的泛化性有一个疑问。
首先,我有三个数据集,分别为a,b,c,然后模型是以a为目标进行搭建的,
a,b,b数据集全都进行了划分,每个数据集均分为:训练集,测试集,验证集 8:1:1,
通过模型,a数据集训练-测试后的结果为90%,b训练-测试后的结果为95%,c训练-测试后结果为87%,
模型面对三个数据集均进行了重新训练然后以对应的测试集进行测试,这样做是否能说明模型的鲁棒性与泛化性?

还是说用a数据集训练完模型,用b数据集或者c数据集直接取一部分进行测试,才能说明模型泛化性鲁棒性?**

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/771208
  • 除此之外, 这篇博客: 2020华数杯C题脱贫帮扶绩效评价你怕了吗?中的 问题二:160 个帮扶单位帮扶着基础不同的村庄,帮扶单位帮扶工作的态度、目标、投入、帮扶干部素质等显然是有差异的。仅仅用 2020 年各村庄评分高低显然是无法真正有效的体现一个帮扶单位在脱贫攻坚提升方面所做出的努力。请你运用附件的数据,阐明什么类型的帮扶单位,哪些帮扶单位在脱贫帮扶上面有较高的绩效?请给不同类型的帮扶单位绩效排序,给出脱贫帮扶绩效前十名的帮扶单位编号。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 基本思路是:构造指标-计算各指标的权重-TOPSIS法进行评价
    为了有效凸显出五年来帮扶单位在脱贫攻坚提升方面所作出的努力,计算了各指标的增长率,即

    2020_SR/2015_SR,2020_CY/2015_CY,……,2020_ZF/2015_ZF
    主成分分析法是一种线性无监督的降维方法,可以通过主成分分析法计算各指标方差贡献率,以此作为各指标的权重。接着采用TOPSIS法进行评价,TOPSIS法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。

    #构造评价指标
    data_2 = pd.DataFrame(data.pivot_table(index=['帮扶单位(0-159)','村庄编号','帮扶单位类型(0-5)'],values=columns)).reset_index()
    for j in range(6):
        data_2['{}_增长率'.format(j)] =  data_2.iloc[:,9+j]/data_2.iloc[:,j+3]
        
    data_2 = data_2.drop(['帮扶单位(0-159)','村庄编号','帮扶单位类型(0-5)'],axis=1).drop(columns,axis=1)
    c = ['CY_增长率','HJ_增长率','SR_增长率','SS_增长率','WJ_增长率','ZF_增长率']
    data_2.columns = c
    
    # 数据归一化
    def Standard(data):
        return (data - data.min())/(data.max()-data.min())
    data_2 = Standard(data_2)
    
    # PCA计算指标权重
    from sklearn.decomposition import PCA
    from sklearn import preprocessing
    pca = PCA(n_components=6)
    pca.fit_transform(data_2)
    weight = pca.explained_variance_ratio_  #方差贡献率
    print(weight)
    
    def topsis(data, weight):
        # 最优最劣方案
        Z = pd.DataFrame([data.min(), data.max()], index=['负理想解', '正理想解'])
        # 距离
        Result = data.copy()
        Result['正理想解'] = np.sqrt(((data - Z.loc['正理想解']) ** 2 * weight).sum(axis=1))
        Result['负理想解'] = np.sqrt(((data - Z.loc['负理想解']) ** 2 * weight).sum(axis=1))
        # 综合得分指数
        Result['综合得分指数'] = Result['负理想解'] / (Result['负理想解'] + Result['正理想解'])
        Result['排序'] = Result.rank(ascending=False)['综合得分指数']
        return Result
    results = topsis(data_2,weight)
    
    results['帮扶单位(0-159)'] = data['帮扶单位(0-159)']
    results['帮扶单位类型(0-5)'] = data['帮扶单位类型(0-5)']
    results.sort_values(by='排序').head(10)
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    首先需要理解模型的泛化性和鲁棒性。泛化性是指模型不仅在训练集上表现好,在测试集和新数据上也能表现良好;鲁棒性是指模型对于不同的数据或数据采集方式的变化具有稳定的分析和预测能力。

    在这个问题中,模型是以a数据集为目标进行构建的,因此在a数据集上表现最好是可以预期的。但对于b和c数据集,模型的泛化性和鲁棒性需要通过重新训练模型来验证。因此,在b和c数据集上重新训练模型,并在同样的测试集上进行测试,可以更全面地评估模型的泛化性和鲁棒性。

    具体解决方案如下:

    1.准备数据集

    将a、b、c数据集都按照8:1:1的比例划分为训练集、验证集和测试集。

    2.训练模型

    使用a数据集训练模型,得到训练-测试的准确率为90%。

    使用b数据集重新训练模型,得到训练-测试的准确率为95%。

    使用c数据集重新训练模型,得到训练-测试的准确率为87%。

    3.在测试集上进行测试

    针对每个数据集,都使用相应的测试集来测试模型,并得到相应的测试准确率。

    4.评估模型的泛化性和鲁棒性

    综合以上测试结果,可以更全面地评估模型在不同数据集上的泛化性和鲁棒性,以确定模型是否具有稳定的分析和预测能力。

    如果模型在不同数据集上的测试准确率都很高,且相差不大,那么可以说明该模型具有很好的泛化性和鲁棒性。

    如果模型在不同数据集上的测试准确率相差很大,那么需要进一步探究原因并改进模型。

    综上所述,只有用a数据集训练完模型,然后用b数据集或c数据集取一部分进行测试,是不能完全说明模型的泛化性和鲁棒性的。需要对不同数据集都重新训练模型,并在相应的测试集上进行测试,才能更全面地评估模型的泛化性和鲁棒性。