美国教育数据分析

部署运行你感兴趣的模型镜像

目录

第1关:认识数据

任务描述本关任务:使用python查看数据属性名称。

代码

第2关:数据预处理

任务描述本关任务:使用sklearn填补数据缺失值,并进行标准化。

代码

第3关:数学成绩预测

任务描述本关任务:使用sklearn对教育数据中数学成绩分数进行预测。

代码


第1关:认识数据

任务描述
本关任务:使用python查看数据属性名称。

相关知识
为了完成本关任务,你需要掌握:1. 如何获取数据;2. 如何查看数据。

如何获取数据
这里是一份美国教育数据,以csv文件的形式保存,文件名为states_all.csv。部分数据如下:


在python中我们可以使用pandas库获取数据:

import pandas as pd 
df = pd.read_csv('states_all.csv')
如何查看数据
获取数据后,我们可以对数据进行查看,比如查看数据有多少样本,每个样本有多少属性:

df.shape
>>>(1497,25)
我们还能够查看有哪些属性:

df.keys()
>>>Index(['PRIMARY_KEY', 'STATE', 'YEAR', 'ENROLL', 'TOTAL_REVENUE',
       'FEDERAL_REVENUE', 'STATE_REVENUE', 'LOCAL_REVENUE',
       'TOTAL_EXPENDITURE', 'INSTRUCTION_EXPENDITURE',
       'SUPPORT_SERVICES_EXPENDITURE', 'OTHER_EXPENDITURE',
       'CAPITAL_OUTLAY_EXPENDITURE', 'GRADES_PK_G', 'GRADES_KG_G',
       'GRADES_4_G', 'GRADES_8_G', 'GRADES_12_G', 'GRADES_1_8_G',
       'GRADES_9_12_G', 'GRADES_ALL_G', 'AVG_MATH_4_SCORE', 'AVG_MATH_8_SCORE',
       'AVG_READING_4_SCORE', 'AVG_READING_8_SCORE'],
      dtype='object')
其中,部分属性所代表意义如下:

属性名称    含义
PRIMARY_KEY    关键字
STATE    州
YEAR    年份
ENROLL    入学登记
TOTAL_REVENUE    总收益
FEDERAL_REVENUE    联邦政府收入
STATE_REVENUE    财政收入
LOCAL_REVENUE    地方收入
TOTAL_EXPENDITURE    总支出
INSTRUCTION_EXPENDITURE    教育支出
SUPPORT_SERVICES_EXPENDITURE    支持服务支出
OTHER_EXPENDITURE    其它支出
CAPITAL_OUTLAY_EXPENDITURE    资本支出费用
GRADES_PK_G    学前教育人数
GRADES_KG_G    幼儿园学生人数
GRADES_4_G    四年级学生人数
GRADES_8_G    八年级学生人数
GRADES_12_G    十二年级学生人数
GRADES_1_8_G    一到八年级学生人数
GRADES_9_12_G    九到十二年级学生人数
GRADES_1_8_G    一到八年级学生人数
GRADES_ALL_G    所有学生人数
AVG_MATH_4_SCORE    四年级数学平均成绩
AVG_MATH_8_SCORE    八年级数学平均成绩
AVG_READING_4_SCORE    四年级阅读平均成绩
AVG_READING_8_SCORE    八年级阅读平均成绩
df.keys()方法可以查看数据有哪些属性,也就是csv文件中的第一行里面的内容。同样的我们可以根据这些属性名称,查看对应数据的分布情况:

df['TOTAL_EXPENDITURE']
>>> 0        2653798.0
    1         972488.0
    2        3401580.0
    3        1743022.0
    4       27138832.0
    5        3264826.0
    6        3721338.0
    7         638784.0
    8         742893.0
    9       11305642.0
    10       5535942.0
    11       1040121.0
    12        886161.0
    13       9850560.0
    14       5182754.0
    15       2795774.0
    16       2234915.0
    17       2518082.0
    18       3362853.0
    19       1228869.0
    20       4698374.0
    21       5245560.0
    22      10170688.0
    23       4981125.0
    24       1691990.0
    25       4197600.0
    26        781009.0
    27       1534046.0
    28       1251651.0
    29       1066647.0
    1170    53096761.0
    1171     4385896.0
    1172     1876197.0
    1173    15690444.0
    1174    12806300.0
    1175     3499873.0
    1176    11255186.0
    1177     1775999.0
    1178     7501799.0
    1179     2968341.0
    1180     7902600.0
    1181     5350543.0
    1182    78365958.0
    1183     9557682.0
    1184    10542667.0
    1185     1975093.0
    1186     1360942.0
    1187    27277049.0
    1188    18501103.0
    1189     2521004.0
    1190     2029520.0
    1191    32410033.0
    1192    11378564.0
    1193     6772654.0
    1194     6175724.0
    1195     7554887.0
    1196     8437263.0
    1197     2596180.0
    1198    13882823.0
    1199    16972319.0
    Name: TOTAL_EXPENDITURE, Length: 1200, dtype: float64
当然这样看起来并不直观,我们可以对数据进行可视化:

df['TOTAL_EXPENDITURE'].hist()
输出图片如下:


这样我们可以清楚的了解到数据的一个分布情况。

编程要求
根据提示,在右侧Begin-End区域补充代码,查看数据属性名称。

测试说明
程序会调用你实现的方法,查看数据属性名称,若与正确结果一致,则视为通关。

代码

# -*- coding: utf-8 -*-
 
def get_feature_names(df):
    '''
    input:df(DataFrame):输入数据
    output:feature_names
    '''
    #*********Begin*********#
    feature_names = df.keys()
    #********** End **********#
    return feature_names

第2关:数据预处理

任务描述
本关任务:使用sklearn填补数据缺失值,并进行标准化。

相关知识
为了完成本关任务,你需要掌握:1. 数据预处理;2. 估算缺失值;3. 标准化。

数据预处理
我们需要做的事就是让模型从数据中学习到规律,然后对未知数据进行预测,而这份最开始的教育数据其中绝大多数是“有毛病”的:


如上图,可以看出数据中有很多的nan代表缺失值,不利于后期进行分析,所以我们在分析前需要进行数据的预处理。sklearn.preprocessing包提供了几个常用的函数和转换类,用它们将一个原始的特征向量转化为一个更适于数据分析的表示形式。一般来说,学习算法收益于数据集的标准形式。如果数据中存在异常点,稳健的数据规范或转换是更适合的。

估算缺失值
为什么要估算缺失值
由于各种原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、NaNs,或者是其他的占位符。但是这样的数据集并不能被sklearn学习算法兼容,因为大多的学习算法都默认假设数组中的元素都是数值,因而所有的元素都有自己的意义。 使用不完整的数据集的一个基本策略就是舍弃掉整行或整列包含缺失值的数据。但是这样就付出了舍弃可能有价值数据(即使是不完整的 )的代价。 处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值。

Imputer
sklearn中使用Imputer方法估算缺失值,使用方法如下:

from sklearn.preprocessing import Imputer
data = [[np.nan, 2], [6, np.nan], [7, 4],[np.nan,4]]
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)#缺失值为nan,沿着每一列,使用平均值来代替缺失值
data = imp.fit_transform(data)
>>>data
array([[6.5       , 2.        ],
       [6.        , 3.33333333],
       [7.        , 4.        ],
       [6.5       , 4.        ]])
其中strategy参数用来选择代替缺失值方法:

mean表示使用平均值代替缺失值;
median表示使用中位数代替缺失值;
most_frequent表示使用出现频率最多的值代替缺失值。
missing_values参数表示何为缺失值:

NaN表示np.nan为缺失值;
0表示0为缺失值。
标准化
为什么要进行标准化
对于大多数数据挖掘算法来说,数据集的标准化是基本要求。这是因为,如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。实际上,我们经常忽略数据的分布形状,而仅仅做零均值、单位标准差的处理。在一个机器学习算法的目标函数里的很多元素所有特征都近似零均值,方差具有相同的阶。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得模型不能从其它特征有效地学习。

Z-score标准化
这种方法基于原始数据的均值mean和标准差standard deviation进行数据的标准化。将特征A的原始值x使用z-score标准化到x。z-score标准化方法适用于特征A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在0附近,方差值为1。数学公式如下:


,
 = 

std

 
x−x 
mean

 

 

函数scale为数组形状的数据集的标准化提供了一个快捷实现:

from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X_train)
>>>X_scaled
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])
经过缩放后的数据具有零均值以及标准方差:

>>> X_scaled.mean(axis=0)
array([ 0.,  0.,  0.])
>>> X_scaled.std(axis=0)
array([ 1.,  1.,  1.])
Min-max标准化
Min-max标准化方法是对原始数据进行线性变换。设minA和maxA分别为特征A的最小值和最大值,将A的一个原始值x通过min-max标准化映射成在区间[0,1]中的值x',其公式为:


,
 = 

max

 −x 
min

 
x−x 
min

 

 

可以使用MinMaxScaler实现,以下是一个将简单的数据矩阵缩放到[0, 1]的例子:

X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
      [ 1.        ,  0.5       ,  0.33333333],
      [ 0.        ,  1.        ,  0.        ]])
MaxAbs标准化
MaxAbs的工作原理与Min-max非常相似,但是它只通过除以每个特征的最大值将训练数据特征缩放至 [-1, 1] 范围内,这就意味着,训练数据应该是已经零中心化或者是稀疏数据。公式如下:


,
 = 

max

 
x

 

可以使用MaxAbsScale实现,以下是使用上例中数据运用这个缩放器的例子:

X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
>>> X_train_maxabs
array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])
编程要求
根据提示,在右侧编辑器补充代码,填补数据缺失值,且对数据进行MinMaxScaler标准化。

测试说明
程序会调用你的方法对数据进行处理,若处理后与正确数据一致,则视为通关。

代码

# -*- coding: utf-8 -*-
from sklearn.preprocessing import Imputer,MinMaxScaler
 
def data_preprocessing(data):
    '''
    input:data(ndarray):待处理数据
    output:preprocessing_data(ndarray):预处理后数据
    '''
    #*********Begin*********#
    imp = Imputer(missing_values='NaN', strategy='mean', axis=0) 
    data = imp.fit_transform(data) 
    min_max_scaler =MinMaxScaler()
    preprocessing_data = min_max_scaler.fit_transform(data)
    #********** End **********#
    return preprocessing_data

第3关:数学成绩预测

任务描述
本关任务:使用sklearn对教育数据中数学成绩分数进行预测。

相关知识
为了完成本关任务,你需要掌握:构建线性回归模型进行预测。

构建线性回归模型进行预测
我们对数据预处理完成之后,就可以对数学成绩分数进行预测,这是一个回归问题,我们可以建立一个线性回归模型来进行预测:

from sklearn.linear_model import LinearRegression
#构建线性回归模型
lr = LinearRegression()
#利用训练集数据与标签对模型进行训练
lr.fit(train_data,train_label)
#对测试集数据进行预测
predict = lr.predict(test_data)
关于线性回归算法具体内容请点击查看

编程要求
根据提示,在右侧编辑器补充代码,实现数学成绩分数预测方法。

测试说明
程序会调用你实现的方法对数据进行预测,若模型评估指标值大于0.95则视为通关。

代码

# -*- coding: utf-8 -*-
from sklearn.linear_model import LinearRegression
 
def lr(train_data,train_label,test_data):
    '''
    input:train_data(ndarray):训练数据
          train_label(ndarray):训练标签
          test_data(ndarray):测试数据
    output:predict(ndarray):测试数据预测标签
    '''
    #********* Begin *********#
    lr = LinearRegression()
    lr.fit(train_data,train_label) 
    predict= lr.predict(test_data)
    #********** End **********#
    return predict

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柒_02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值