机器学习 —— 分类预测与集成学习(上)

简介: 机器学习 —— 分类预测与集成学习

   从指定的数据源读取数据,对数据进行必要的处理,选取合适的特征,构造分类模型,确定一个人的年收入是否超过50K。

   数据来源:1994年美国人口普查数据库。(原始数据下载地址:https://archive.ics.uci.edu/ml/datasets/Adult )。数据存放在data目录中,其中,adult.data存放训练数据,adult.test存放测试数据。

特征列

age:年龄,整数

workclass:工作性质,字符串,包含少数几种取值,例如:Private、State-gov等

education:教育程度,字符串,包含少数几种取值,例如:Bachelors、Masters等

education_num:受教育年限,整数

maritial_status:婚姻状况,字符串,包含少数几种取值,例如:Never-married、Divorced等

occupation:职业,字符串,包含少数几种取值,例如:Sales、Tech-Support等

relationship:亲戚关系,字符串,包含少数几种取值,例如:Husband、Wife等

race:种族,字符串,包含少数几种取值,例如:White、Black等

sex:性别,字符串,包含少数几种取值,例如:Female, Male

capital_gain:资本收益,浮点数

capital_loss:资本损失,浮点数

hours_per_week:每周工作小时数,浮点数

native_country:原籍,包含少数几种取值,例如:United-States, Mexico等

分类标签列:income

>50K

≤50K

(一)数据探查

       熟悉数据,查看数据结构和数据分布情况

1. 读取数据文件,查看行列信息

       文本(字符串)字段的Dtype属性为"object"

import numpy as np
import pandas as pd
train_data_path = 'adult.txt' # 训练数据
test_data_path = 'adult.test' # 测试数据
train_data = pd.read_csv(train_data_path, header=None) # 训练数据文件中不包含列名
test_data = pd.read_csv(test_data_path, header=None, skiprows=1) # 测试文件中的第一行数据无意义,应跳过(skiprows=1)
# 指定各个列的名称
col_labels = ['age', 'workclass', 'fnlwgt', 'education', 'education_num', 'marital_status',
              'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
              'hours_per_week', 'native_country', 'wage_class']
train_data.columns = col_labels # 赋值给train_data列索引
test_data.columns = col_labels # 赋值给test_data列索引
print(train_data.info())#给出样本数据的相关信息概览 :行数,列数,列索引,列非空值个数,列类型,内存占用

图1:读取训练和测试数据文件,并查看行列信息

2. 查看数值类型列的数据描述信息

       对于数值类型的列,可以分别查看每列的基本统计信息,例如:数据个数、均值、标准差、极值、四分位数、中位数

print(train_data.describe())#给出样本数据的一些基本的统计量,包括均值,标准差,最大值,最小值,分位数等

图2:查看数值类型列的数据描述信息

3. 以可视化的方式查看数值类型的取值分布情况

       在上一步骤中,我们可以通过输出的结果看到capital_gain和capital_loss列的极小值、四分位数均为0,而极大值很大,这意味着其数据主要分布在0附近。可以通过分箱统计的方式查看数值分布情况

       直方统计图是很直观的查看数值分布的方法。下面的代码将所有数值分成20个区间,然后统计每个区间中的数据个数

import matplotlib.pyplot as plt
# 用在Jupyter notebook中具体作用是当你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,可以直接在你的python console里面生成图像。效果如下:
%matplotlib inline 

numeric_columns = ['age','fnlwgt','education_num','capital_gain','capital_loss','hours_per_week']

#采用直方统计图按顺序可视化以上六个指标的取值分布情况
#六个图都画在同一个画布中
#每个图都要标注图名(哪个指标的可视化结果)

plt.figure(figsize=(16,12)) # 建立画布,figsize设置画布大小
# 使用for循环numeric_columns列表的长度将六个图都画在同一个画布中(i从0开始)
for i in range(len(numeric_columns)):
    plt.subplot(2,3,i+1) # 建系 plt.subplot(行数、列数、索引数(1开始))
    plt.hist(train_data[numeric_columns[i]],bins=20) # 直方图
    plt.title(numeric_columns[i]) # 设置图像标题
    plt.ylabel("Frequency") # 设置y轴的标签文本
    
plt.savefig("one.png") # 保存图片
plt.show()# 把图像显示出来。

图3:以可视化的方式查看数值类型的取值分布情况

图4:one.png

4. 查看文本类型列的取值

       对于文本类型的列,观察文本的取值有哪些

      unique函数用于提取出数据集合中的唯一值

       可以发现,某些列(例如:workclass, occupation,native_country等)包含’?'这样的字符,可视为缺失值。后续应处理此类缺失值

       还可以发现,训练数据的wage_class包括两个值:<=50K 和 >50K 而测试数据的是:<=50K. 和 >50K. 后续应使二者统一

print("训练数据:")
for column in train_data.columns:#循环输出train_data各个列的信息
    #判断文本(字符串)字段的Dtype属性是否为"object"
    if train_data[column].dtype == 'object':
        print(column + "取值为:")
#         unique()方法返回的是去重之后的不同值
        print(train_data[column].unique())#提取数据集合中的唯一值(去除重复的元素)
        print("==========================")
print("=========================================================")
print("测试数据:")
for column in test_data.columns:#循环输出test_data各个列的信息
    #判断文本(字符串)字段的Dtype属性是否为"object"
    if test_data[column].dtype == 'object':
        print(column + "取值为:")
        print(test_data[column].unique())#提取数据集合中的唯一值(去除重复的元素)
        print("==========================")

图5:查看文本类型列的取值

图6:查看训练数据文本类型列的取值

图7:查看测试数据文本类型列的取值

5. 查看文本类型的取值分布情况

text_columns = ['workclass','education','marital_status','occupation','relationship','race','sex','native_country','wage_class']
#采用柱状图,按顺序可视化以上九个指标的取值分布情况(温馨提示,此处需要求和哦)
#九个图都画在同一个画布中
plt.figure(figsize=(22,26)) # 建立画布,figsize设置画布大小
# 使用for循环text_columns列表的长度将九个图都画在同一个画布中(i从0开始)
for i in range(len(text_columns)):
    plt.subplot(5,2,i+1) # 建系 plt.subplot(行数、列数、索引数(1开始))
    value_counts = train_data[text_columns[i]].value_counts()# 先求和
    plt.bar(value_counts.index, value_counts.values)# 再画柱状图
    plt.xticks(rotation=50) # 设置x轴的文本倾斜50度
    plt.title(text_columns[i]) # 设置图像标题
plt.savefig("two.png") # 保存图片
plt.show()# 把图像显示出来。

图8:查看文本类型的取值分布情况

图9:two.png

6. 观察某行数据及单个字段

       下面的探查中,发现workclass字段的第一个字符为空格符

       进一步可以发现,所有的文本字段第一个字符均为空格。为便于数据处理,后续应设法将多余的空格去除

# 获取第1行数据
# iloc索引器用于按位置进行基于整数位置的索引或者选择。
print(train_data.iloc[0])
print("==========================")
# 获取第1行第2列
workclass = train_data.iloc[0, 1]
print(workclass)      # 可观察到输出中的第一个字符是空格
print(len(workclass))    # 该长度包括了空格

图10:观察某行数据及单个字段

7. 分析education取值与wage_class的对应数量关系

print("教育类型取值:")
print(train_data.education.unique())#提取数据集合中的唯一值(去除重复的元素)
# Pandas中的crosstab(交叉表)函数
result = pd.crosstab(index=train_data['wage_class'], columns=train_data['education'], rownames=['wage_class'])#使用交叉表函数,分析education取值与wage_class的对应数量关系
print(result)#输出education取值与wage_class的对应数量关系

图11:分析education取值与wage_class的对应数量关系

(二)数据清洗

       针对数据探查中发现的一些问题,对数据进行某些修改和调整。

1. 去除所有文本字段首尾的多余空格

       train_data.dtypes属性记录了数据集中所有列的类型信息,包括列下标索引(index)及对应的类型名称

       train_data.dtypes[index]返回指定下标索引的列的类型。此处仅匹配类型为文本字符串(object)的列

       train_data[column_index].str.strip()用于将指定列数据转换成字符串,然后调用strip函数去除首尾空格

# 去除训练数据集字段中多余的空格
# train_data.dtypes属性记录了数据集中所有列的类型信息,包括列下标索引(index)及对应的类型名称
for column_index in train_data.dtypes.index:
    #train_data.dtypes[column_index]返回指定下标索引的列的类型。此处仅匹配类型为文本字符串(object)的列
    if train_data.dtypes[column_index] == 'object':
        # train_data[column_index].str.strip()用于将指定列数据转换成字符串,然后调用strip函数去除首尾空格
        train_data[column_index] = train_data[column_index].str.strip()

# 去除测试数据集字段中多余的空格
# test_data.dtypes属性记录了数据集中所有列的类型信息,包括列下标索引(index)及对应的类型名称
for column_index in test_data.dtypes.index:
    #test_data.dtypes[column_index]返回指定下标索引的列的类型。此处仅匹配类型为文本字符串(object)的列
    if test_data.dtypes[column_index] == 'object':
        # test_data[column_index].str.strip()用于将指定列数据转换成字符串,然后调用strip函数去除首尾空格
        test_data[column_index] = test_data[column_index].str.strip()
        
# 查看结果
workclass = train_data.iloc[0, 1]# 获取train_data第1行第2列
print(workclass)
print(len(workclass))#workclass的长度

图12:所有文本字段首尾的多余空格

2. 统一分类标签

       和之前一样,训练数据和测试数据的wage_class字段的值应统一

       此处将测试数据集中的标签列更改成与训练数据集的一致,即:去掉原始标签值最后的"."号

# str.strip('.')去掉原始标签值最后的"."号
test_data['wage_class'] = test_data['wage_class'].str.strip('.')
# 查看结果
print(test_data['wage_class'].unique())#提取数据集合中的唯一值(去除重复的元素)

图13:统一分类标签

3. 处理’?'字段

       对于训练数据集,用’?'标记的字段,视为无效值,本例中直接移除含有无效值的样本行

       对于测试数据集,带’?'的数据,用出现次数最多的值(文本字段)填充

print("原始数据:")
print(train_data['workclass'].unique())#提取数据集合中的唯一值(去除重复的元素)
# replace('?', np.nan)将“?”转为无效值np.nan
# dropna()函数的作用是去除读入的数据中(DataFrame)含有NaN的行
train_data = train_data.replace('?', np.nan).dropna()#将“?”转为无效值,然后删除
print("更改后的数据:")
print(train_data['workclass'].unique())#提取数据集合中的唯一值(去除重复的元素)

图14:处理’?'字段(将“?”转为无效值,然后删除)

print("测试数据修正前:") #0-10行,并且是workclass,occupation,native_country的数据
print(test_data.loc[:10, ['workclass', 'occupation', 'native_country']])

for column in test_data.columns:
    if test_data[column].dtype == 'object':
#         使用value_counts()方法显示Pandas系列中的最频繁的值
        column_most_common_value = test_data[column].value_counts().index[0]#获取出现次数最多的值
#         replace('?', column_most_common_value)将“?”转为出现次数最多的值(column_most_common_value)
        test_data[column] = test_data[column].replace('?', column_most_common_value)#带'?'的数据,用出现次数最多的值(文本字段)填充

print("测试数据修正后:")#0-10行,并且是workclass,occupation,native_country的数据
print(test_data.loc[:10, ['workclass', 'occupation', 'native_country']])

图15:处理’?'字段(将“?”转为出现次数最多的值)

(三)数据预处理

       将各个特征转换成模型训练所需要的类型或格式。

1. 文本字段转换成数值字段的方法试验

       workclass的取值是文本类型,但模型训练需要的特征必须是数值,因此需要转换

       通过Categorical函数,可将文本转换成数值。相同的文本值被赋予相同的数值,并且从1,2,3…依次增长

# Categorical函数,将文本转换成数值。相同的文本值被赋予相同的数值,并且从1,2,3...依次增长
workclass_categorical = pd.Categorical(train_data['workclass'])
print(workclass_categorical.codes )

图16:文本字段转换成数值字段的方法试验

机器学习 —— 分类预测与集成学习(下)https://developer.aliyun.com/article/1507854?spm=a2c6h.13148508.setting.24.1b484f0eMnwKQL


相关文章
|
7天前
|
机器学习/深度学习 人工智能 运维
【机器学习】Adaboost: 强化弱学习器的自适应提升方法
在机器学习领域,集成学习是一种通过结合多个弱模型以构建更强大预测模型的技术。Adaptive Boosting,简称Adaboost,是集成学习中的一种经典算法,由Yoav Freund和Robert Schapire于1996年提出。Adaboost通过迭代方式,自适应地调整数据样本的权重,使得每个后续的弱学习器更加关注前序学习器表现不佳的样本,以此逐步提高整体预测性能。本文将深入探讨Adaboost的工作原理、算法流程、关键特性、优势及应用场景,并简要介绍其实现步骤。
13 1
|
10天前
|
机器学习/深度学习 数据采集 人工智能
使用Python和Scikit-learn实现机器学习分类任务
使用Python和Scikit-learn实现机器学习分类任务
27 1
|
11天前
|
机器学习/深度学习 敏捷开发 测试技术
深入探索软件测试中的持续集成与持续部署(CI/CD)实践利用机器学习提升网络安全防御效能
【5月更文挑战第27天】 在现代软件开发的快节奏环境中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为确保产品质量和加快交付速度的关键策略。本文将深入探讨CI/CD在软件测试中的应用,分析其对提高自动化测试效率、缩短反馈周期以及优化发布流程的重要性。通过实际案例研究,我们揭示了成功实施CI/CD的最佳实践,并讨论了面临的挑战及其解决方案。
|
18天前
|
机器学习/深度学习 监控 算法
【机器学习】提供学习率的直观解释
【5月更文挑战第18天】【机器学习】提供学习率的直观解释
|
23天前
|
机器学习/深度学习
机器学习 —— 分类预测与集成学习(下)
机器学习 —— 分类预测与集成学习(下)
|
8天前
|
机器学习/深度学习 算法 TensorFlow
机器学习算法简介:从线性回归到深度学习
【5月更文挑战第30天】本文概述了6种基本机器学习算法:线性回归、逻辑回归、决策树、支持向量机、随机森林和深度学习。通过Python示例代码展示了如何使用Scikit-learn、statsmodels、TensorFlow库进行实现。这些算法在不同场景下各有优势,如线性回归处理连续值,逻辑回归用于二分类,决策树适用于规则提取,支持向量机最大化类别间隔,随机森林集成多个决策树提升性能,而深度学习利用神经网络解决复杂模式识别问题。理解并选择合适算法对提升模型效果至关重要。
175 4
|
3天前
|
机器学习/深度学习 数据采集 算法
基于机器学习的推荐算法构建技术详解
【6月更文挑战第4天】本文详述了构建基于机器学习的推荐算法,特别是协同过滤方法。从用户和物品相似性的角度,解释了用户-用户和物品-物品协同过滤的工作原理。涵盖了数据准备、预处理、特征工程、模型训练、评估优化及结果展示的构建流程。推荐算法在电商、视频和音乐平台广泛应用,未来将受益于大数据和AI技术的进步,提供更智能的推荐服务。
|
5天前
|
机器学习/深度学习 算法 数据采集
构建一个基于机器学习的交易算法
【6月更文挑战第2天】本文探讨了如何构建基于机器学习的交易算法,关键步骤包括数据收集与预处理、特征选择、模型选择与训练、评估与优化,以及回测与实盘交易。挑战涉及数据质量、过拟合与欠拟合、市场变化与模型适应性。通过结合金融知识与机器学习技术,可创建智能交易系统,但需不断更新优化以应对市场动态。
|
7天前
|
机器学习/深度学习 数据采集 存储
【机器学习】K-近邻算法(KNN)全面解析
K-近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,属于监督学习范畴。它的工作原理简单直观:给定一个训练数据集,对新的输入实例,KNN算法通过计算其与训练集中每个实例的距离,找出距离最近的K个邻居,然后根据这些邻居的类别(对于分类任务)或值(对于回归任务)来预测新实例的类别或值。KNN因其简单高效和无需训练过程的特点,在众多领域中得到广泛应用,如模式识别、推荐系统、图像分类等。
167 0
|
7天前
|
机器学习/深度学习 算法
探索机器学习中的支持向量机(SVM)算法
【5月更文挑战第31天】 在数据科学的广阔天地中,支持向量机(SVM)以其卓越的性能和强大的理论基础脱颖而出。本文将深入剖析SVM的工作原理、核心概念以及实际应用,旨在为读者提供一个清晰的理解视角,并通过实例演示其在分类问题中的有效性。我们将从线性可分的情况出发,逐步过渡到非线性问题的处理方法,并探讨如何通过调整参数来优化模型的性能。
244 0