分类方法实验pandasimblearnsklearn

Posted dlage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分类方法实验pandasimblearnsklearn相关的知识,希望对你有一定的参考价值。

环境:ubuntu、anaconda、python

背景:

实验室的老师写论文需要对照实验,进行数据分类,需要将下面的方法在这个数据集上进行实验。

多层前馈神经网络(MFFNN)、概率神经网络(PNN)、径向基神经网络、模糊神经网络、朴素贝叶斯、C4.5、随机森林、bagging、KNN、EasyEnsembleClassifier

数据集:

数据是这样的(如下图),每个xls文件是一个数据集,A列表示公司的代号,B之后的列是真实公司的特征,(老师没告诉具体是啥)。

要求:

需要将每一年的15个文件合并(按行横着合并)。数据里面有缺失的数据,需要进行填充处理。每年的标签1.xls文件对应的A1-A15的标签,值有(0, 1, 2)三个, 由于我做的实验不需要第3类,所以要删除标签第三类对应的数据。然后进行实验。

涉及到的技术:

sklearn、imblearn、pandas、os

完整代码:

https://github.com/dlagez/classification/blob/master/data_process/data_process.py

数据文件截图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

步骤:

  • 将一个文件夹(年份)中多个xls文件按列合并,返回合并和的数据,DataFrame,先定义一个方法,后面需要用到。
def concat_xls(dir_name):
    dfs = []
    for filename in os.listdir(dir_name):
        if os.path.splitext(filename)[1] == '.xls':
            full_path = os.path.join(dir_name, filename)
            df = pd.read_excel(full_path, header=None, index_col=0)
            dfs.append(df)
    result = pd.concat(dfs, axis=1)
    return result

需要注意:读取时由于第一列是索引名,所以不需要代码自动生成索引名,列名需要自动生成。

 df = pd.read_excel(full_path, header=None, index_col=0)
  • 先把拼接起来的值存储起来(老师需要这个数据)
for year in range(2012, 2018):
    # print(year)
    data_root = '/data/file/classification_data/2012-2019/data_A/'
    data_name = os.path.join(data_root, str(year))
    # print(data_name)
    data = concat_xls(data_name)
    # print(data)
    data.columns = [i for i in range(data.shape[1])]
    data.to_csv(os.path.join('/data/file/classification_data/2012-2019/data_sum/'+str(year), 'data_'+str(year)+'.csv'))

注意拼接的数据列名都是混乱的,所以需要从新设置

data.columns = [i for i in range(data.shape[1])]
  • 处理拼接起来的数据的空值
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_name = os.path.join(data_root+str(year), 'data_'+str(year)+'.csv')
    print(data_name)
    data = pd.read_csv(data_name, index_col=0)
    data_pro = data.fillna(data.mean(), axis=0)
    print(data_pro)
    data_pro.to_csv(os.path.join(data_root+str(year), 'data_pro.csv'))

这里的处理方式是均值填充

  • 将标签值添加到data_pro的末尾
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_root_bq = '/data/file/classification_data/2012-2019/'
    data_name = os.path.join(data_root+str(year), 'data_pro.csv')
    data_pro_read = pd.read_csv(data_name, index_col=0)
    print(data_pro_read)
    bq = pd.read_excel(os.path.join(data_root_bq+str(year), '标签1.xls'), header=None, index_col=0)
    bq.rename(columns={1: 'bq'}, inplace=True)
    print(bq)
    data_bq = pd.concat([data_pro_read, bq], axis=1)
    print(data_bq)
    data_bq.to_csv(os.path.join(data_root+str(year), 'data_bq.csv'))

添加的目的是为了删除第三类标签(2)对应的数据。

  • 删除含有标签2的列:数据和标签一起删除
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_name = os.path.join(data_root+str(year), 'data_bq.csv')
    data = pd.read_csv(data_name,  index_col=0)
    print(data)
    data_bq_drop = data.drop(index=data[data['bq'] == 2].index)
    # data_bq2013_drop = data_bq2013.drop(index=data_bq2013[data_bq2013['bq'] == 2].index)
    print(data_bq_drop)
    data_bq_drop.to_csv(os.path.join(data_root+str(year), 'data_bq_drop.csv'))
  • 将数据分成四份,训练数据、训练标签、测试数据、测试标签,为分类准备数据
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_name = os.path.join(data_root+str(year), 'data_bq_drop.csv')
    data = pd.read_csv(data_name, index_col=0)
    print(data)
    train_size =3 * int(data.shape[0] / 4)
    test_size = int(data.shape[0] - train_size)
    train_data_all = data.iloc[:train_size]
    print(train_data_all)
    test_data_all = data.iloc[train_size:]
    print(test_data_all)
    train_data = train_data_all.iloc[:, :-1]
    print(train_data)
    train_label = train_data_all.iloc[:, -1]
    # train_label.columns = ['bq']
    print(train_label)
    test_data = test_data_all.iloc[:, :-1]
    test_label = test_data_all.iloc[:, -1]
    print(test_data)
    print(test_label)
    train_data.to_csv(os.path.join(data_root+str(year), 'train/train_data.csv'))
    train_label.to_csv(os.path.join(data_root+str(year), 'train/train_label.csv'))
    test_data.to_csv(os.path.join(data_root+str(year), 'train/test_data.csv'))
    test_label.to_csv(os.path.join(data_root+str(year), 'train/test_label.csv'))

由于数据比较多,所以将结果打印出来看看有没有错误的地方。

数据处理部分完成!

参考

https://zhuanlan.zhihu.com/p/110501972
https://blog.csdn.net/sinat_28442665/article/details/104901143

以上是关于分类方法实验pandasimblearnsklearn的主要内容,如果未能解决你的问题,请参考以下文章

ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解

ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解

QGIS入门实战精品教程10.3:QGIS栅格DEM数据重复类方法案例汇总

QGIS入门实战精品教程10.3:QGIS栅格DEM数据重复类方法案例汇总

Weka 常用分类算法效果比较

HCIA-AI_深度学习_图像分类