空值是数据分析中经常遇到的情况,让人无所适从,是当垃圾数据一样抛弃,还是置一些缺省值,尚未定论。就本人而言如果是文本型的一般会填充某个从未遇到的缺省值来替代,如果是数值,一般用加权平均代替,当然有更多的方法。
下图为几条样例数据,关于学生成绩的。
要进行缺失值分析,首先要进行数据读取,下文是读取csv文件的几个例子。
import numpy as np
from sklearn import neural_network
import pandas as pd
mydata= pd.read_csv('C:\Python\Pycharm\machine\schoolrecord.csv')
print('---------------------------行列取值-----------------------------')
print( '\norgdata=\n',mydata)
columnname=['id','maths','english']
newdata=mydata[columnname]
print( "\nmydata[['id','maths','english']]=\n",newdata)
newdata=mydata.iloc[:,3]
print( '\nmydata.iloc[:,3]=\n',newdata)
newdata=mydata.loc[:,'maths']
print( "\nmydata.loc[:,'maths']=\n",newdata)
newdata=mydata['maths']
print( "\nmydata['maths']=\n",newdata)
newdata=mydata.maths
print( '\nmydata.maths=\n',newdata)
row=mydata.loc[:,'maths']
print( "\nmydata.loc[:,'maths']=\n",row)
下列代码是关于缺失值构造的几种常规方法,填0、填平均值、填上一列上一行值。
print('---------------------------空值处理-----------------------------')
mydata= pd.read_csv('C:\Python\Pycharm\machine\schoolrecord.csv')
print( '\nmydata.isna()=\n',mydata.isna())
# 空值填充0
mydata.fillna(0,inplace=True)
print(mydata)
print( '\nmydata.fillna(0,inplace=True)=\n',mydata)
mydata= pd.read_csv('C:\Python\Pycharm\machine\schoolrecord.csv')
print('\nmydata.mean()\n=',mydata.mean())
# 空值填充均值
mydata.fillna(mydata.mean(),inplace=True)
print( '\nmydata.fillna(mydata.mean(),inplace=True)=\n',mydata)
mydata= pd.read_csv('C:\Python\Pycharm\machine\schoolrecord.csv')
# 空值错行填充
mydata.fillna(method='ffill',inplace=True)
print( "\nmydata.fillna(method='ffill',inplace=True)=\n",mydata)
mydata= pd.read_csv('C:\Python\Pycharm\machine\schoolrecord.csv')
# newdata=mydata.fillna(method='ffill',axis=1,inplace=True) 、
# 直接用inplace语法会抛出异常:raise NotImplementedError()
# 空值错列填充
newdata=mydata.fillna(method='ffill',axis=1)
print( "\nmydata.fillna(method='ffill',axis=1)=\n",newdata)
下文是通过多层感知机进行缺省值预测,也称为多层神经网络(大于等于3层,即至少含有1层隐含层),也称为全连接神经网络。
最简单的MLP只含一个隐层,即三层的结构
# 通过机器学习MLP神经网络算法填充缺失值
mydata= pd.read_csv('C:\Python\Pycharm\machine\schoolrecord.csv')
newdata=mydata.sort_values(by=['maths'],na_position='last')
print('\nnewdata=\n',newdata)
# 获取非空的训练集
train_x=newdata.iloc[:7,1:3]
print('\ntrainx=\n',train_x)
# 获取非空的结果集
train_y=newdata.iloc[:7,3:4]
print('\ntrainy=\n',train_y)
# 多层感知器分类器-MLPClassifier
model=neural_network.MLPClassifier()
# 进行模型训练
model.fit(train_x,train_y)
# 获取空的测试集
test_x=newdata.iloc[7:,1:3]
# 进行模型预测
test_y=model.predict(test_x)
print('\ntest_x=\n',test_x)
print('\ntest_y=\n',test_y)
newdata.iloc[7:,3:4]=test_y.tolist()
print('\nmydata=\n',mydata)
print('\nnewdata=\n',newdata)