Ex1:缺失值与类别的相关性检验
在数据处理中,含有过多缺失值的列往往会被删除,除非缺失情况与标签强相关。下面有一份关于二分类问题的数据集,其中X_1, X_2为特征变量,y为二分类标签。
import numpy as np
import pandas as pd
data = [[np.nan,np.nan,0],[1,np.nan,0],[np.nan,2,0],[np.nan,np.nan,0],[np.nan,np.nan,1]]
df = pd.DataFrame(data = data,
columns= ['X_1','X_2','y'])
cat_1 = df.X_1.fillna('NaN').mask(df.X_1.notna()).fillna("NotNaN")# 首先把np.nan的行填充‘Sting'型Nan,然后把非空的转变为空,再填上’string‘型’notnan‘
cat_2 = df.X_2.fillna('NaN').mask(df.X_2.notna()).fillna("NotNaN")# 同理
df_1 = pd.crosstab(cat_1, df.y, margins=True)#交叉的概念
df_2 = pd.crosstab(cat_2, df.y, margins=True)
def compute_S(my_df):#按着题上给出的公式,算出S
S = []
for i in range(2):
for j in range(2):
E = my_df.iat[i, j]# 通过行号列号来去值
F = my_df.iat[i, 2]*my_df.iat[2, j]/my_df.iat[2,2]
S.append((E-F)**2/F)
return sum(S)
res1 = compute_S(df_1)
res2 = compute_S(df_2)
from scipy.stats import chi2
chi2.sf(res1,1)
chi2.sf(res2, 1)
Ex2:用回归模型解决分类问题
2. 请根据第1问中的方法,对audit数据集中的Employment变量进行缺失值插补。
1.对于回归问题而言,需要得到的是一个具体的数值,因此预测值由最近的 n个样本对应的平均值获得。请把上面的这个分类问题转化为回归问题,仅使用KNeighborsRegressor来完成上述的KNeighborsClassifier功能。
data= [[-2.5,2.8,'Blue'],[-1.5,2.8,'Blue'],[-0.8,2.8,np.nan],[1,2,'Red'],[2,5,np.nan],[4,-4,'Yellow'],[1,-4.3,'Yellow'],[4,2,'Red'],[3,1,'Red'],[3.4,2,np.nan],[-2.3,4.1,'Red']]
df = pd.DataFrame(data=data,
columns=['X1','X2','Color'])
# df
from sklearn.neighbors import KNeighborsRegressor
df_dummies = pd.get_dummies(df.Color)
stack_list = []
for col in df_dummies.columns:
clf = KNeighborsRegressor(n_neighbors=3)#直接调用线性回归
clf.fit(df.iloc[:,:2], df_dummies[col])#越接近1,说明越是某个颜色。
res = clf.predict([[0.8, -0.2]]).reshape(-1,1)
stack_list.append(res)#
code_res = pd.Series(np.hstack(stack_list).argmax(1))
df_dummies.columns[code_res[0]]
'Red'
from sklearn.neighbors import KNeighborsRegressor
res_df = df.copy()
temp = pd.concat([pd.get_dummies(df[['X1','X2']]),df.Color],1)
# df = pd.concat([pd.get_dummies(df[['Marital', 'Gender']]), df[['Age','Income','Hours']].apply(lambda x:(x-x.min())/(x.max()-x.min())), df.Employment],1)
# # 一个连接操作
X_train = df.query('Color.notna()')# 不是空值
X_test = df.query('Color.isna()')# 是空值
# print(X_train)
# print(X_test)
df_dummies = pd.get_dummies(X_train.Color)
# print(df_dummies)
stack_list = []
for col in df_dummies.columns:
clf = KNeighborsRegressor(n_neighbors=3)
clf.fit(X_train.iloc[:,:-1], df_dummies[col])
res = clf.predict(X_test.iloc[:,:-1]).reshape(-1,1)
stack_list.append(res)
code_res = pd.Series(np.hstack(stack_list).argmax(1))#寻找最合适的值,最大值也就是最接近的值
cat_res = code_res.replace(dict(zip(list(range(df_dummies.shape[1])),df_dummies.columns)))#根据索引,把预测的值放入
res_df.loc[res_df.Color.isna(), 'Color'] = cat_res.values#完成一个赋值的工作
res_df.isna().sum()
X1 0
X2 0
Color 0
dtype: int64