python缺失值处理的⽅法
咋说呢,这本来是我们统计⽼师给的⼀个⼩期中作业,⽅法并不详尽,我了⼏个简单的,看个乐就⾏。泰坦尼克号数据集的使⽤是因为之前做过它的⼀系列分析,所以图个⽅便。其他数据⽂件由于缺失值⽐较少甚⾄没有缺失值,我就⼈为的制造缺失值,建议⽤代码实现这⼀过程。
⽬录
1、删除元组
(1)删除存在缺失值的个案
这⼀变量存在部分缺失,可以尝试删除变量Age缺失的纪录
图为泰坦尼克数据集
import pandas as pd
import numpy as np
#读⼊数据
ad_csv('C:/Users/24580/Desktop/数据挖掘/train.csv')
data.head(30)
data1_1=data.dropna(subset=['Age'])
data1_1.head(20)
(2)删除含特殊值的特征
举例:通过观察泰坦尼克数据集可以发现,数据的Cabin这⼀变量⼤部分数据都未知,可以尝试将Cabin这⼀特征变量给删除
#(基于1.1的数据)
data1_2=data.drop(columns=['Cabin'])
data1_2.head(20)
2、不处理
不处理,就直接进⾏下⼀步,贼佛系的做法,但总有⼀定依据
3、缺失值插补
有多种⽅式补齐数据,以下只简单罗列了5种⽅法
(1)⼈⼯补齐数据,适⽤于规模⼩,缺失少的数据
举例:在成绩表student中,由于⼩张的语⽂试卷不慎丢失,⽼师按照他上课的表现进⾏打分
import pandas as pd
import numpy as np
#读⼊数据
ad_excel('C:/Users/24580/Desktop/社会⽹络/student.xlsx')
data=data.fillna(95)
data
(2)⽤平均数补齐数据
举例:通过观察泰坦尼克数据集可以发现,数据的Age这⼀变量存在部分缺失,⽤平均数来插补缺失的Age值
#(基于1.1的数据)
#填充age(平均数)
data['Age']=data['Age'].fillna(data['Age'].median())
data3_2=data
data3_2.head(10)
(3)⽤众数补齐数据
举例:通过观察泰坦尼克数据集可以发现,数据的Embarked这⼀变量存在部分缺失,⽤众数来插补缺失的Embarked值
#(基于1.1的数据)
#填充embarked
cishu=data['Embarked'].value_counts()#计数
index_max=cishu.idxmax()
print(index_max)
data['Embarked']=data['Embarked'].fillna(index_max)
data3_3=data
data3_3.head(10)
(4)回归建模填充数据
举例:在Salary_Data.csv数据⽂件中包含两个变量,⼀个是⼯作年龄,⼀个是薪资⽔平Salary,其中Salary有部分数据缺失,鉴于YearsExperience与Salary有强烈的线性相关关系,故拟采⽤线性回归的⽅法进⾏数据填充
import seaborn as sns
import statsmodels.api as sm
import matplotlib.pyplot as plt
#读⼊数据
ad_csv('C:/Users/24580/Desktop/社会⽹络/Salary_Data.csv')
data.head(10)
print(data.isna().sum())
#画散点图
sns.lmplot(x='YearsExperience',y='Salary',data=data,ci=None)
plt.show()
#有缺失的记录,建⽴需预测的⼦集
data_pred=data[np.isnan(data['Salary'])]
X_pred=pd.DataFrame(data_pred)
y_pred=data_pred['Salary']
#⽆缺失值的记录,即训练⼦集
data_train=data.dropna(subset=['Salary'],axis=0)
#建模
fit=sm.formula.ols('Salary~YearsExperience',data=data_train).fit()
print(fit.params)
#预测
y_pred=fit.predict(X_pred)
print(y_pred)
data_pred['Salary']=y_pred
print(data_pred)
#数据合并
data=data_train.append(data_pred)
data.head(10)
共5个缺失值
散点图表⽰两者存在明显线性关系
回归⽅程系数
为预测的缺失部分的估计值,将数据合并即可
(5)K最近邻算法,最近k个样本的均值进⾏数据填补
举例:CCPP数据集中,前四个变量是⾃变量,最后⼀列为连续的因变量PE,表⽰⾼炉的发电量,其中PE列存在数据缺失,拟通过KNN模型进⾏预测填补
其中最佳的临近个数设置为7,是通过10重交叉验证所选取的最佳K值
(本代码段未包含交叉验证的代码)
from sklearn import neighbors
from sklearn.preprocessing  import minmax_scale
#读⼊数据
ad_excel('C:/Users/24580/Desktop/社会⽹络/CCPP.xlsx')
data.head(10)
lumns[:-1]#⾃变量名称
X=minmax_scale(data[predictors])#标准化
print(data.isna().sum())  #缺失值个数
#有缺失的记录,建⽴需预测的⼦集
data_pred=data[np.isnan(data['PE'])]
x_test=pd.DataFrame(data_pred[predictors])
y_test=data_pred['PE']
#⽆缺失值的记录,即训练⼦集python怎么读csv数据
data_train=data.dropna(subset=['PE'],axis=0)
y_train=data_train['PE']
x_train=data_train[predictors]
#建模
knn=neighbors.KNeighborsRegressor(n_neighbors=7,weights='distance')
knn.fit(x_train,y_train)
#预测
pred=knn.predict(x_test)
print(pred)
data_pred['PE']=pred
print(data_pred)
#数据合并
data=data_train.append(data_pred)
data.head(10)
原数据
共15个缺失
预测的15个缺失值,将数据合并即可
总结⼀下:
其他⽅法:
1、针对时间序列可以通过建模进⾏预测,然后填补数据
2、多重插补
3、热卡填充……
还有很多⽅法可以使⽤,按我的拙见是:只要能进⾏预测的模型,按理都可以预测缺失值,只是模型的准确率会有所不同⽅法总结:
⼤致梳理⼀下回归和KNN进⾏预测的步骤,其他有的模型也可参照这样:
1、观察数据,选择所需模型或⽅法
2、将有缺失的数据记录从原数据集中提取出来,形成测试集test
(如果需要将⾃变量、因变量数据拆分,则拆分为x_test,y_test)剩余部分形成训练集train
(同理,训练集可能也需要拆分)
3、对训练集train进⾏建模
4、对测试集test进⾏模型的预测,得到估计值
5、将估计值与原数据合并
(总感觉⾃⼰说的废话,hhh,看看就⾏)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。