精华内容
下载资源
问答
  • python_通过KNN填充缺失值

    千次阅读 2019-12-18 16:25:16
    python_通过KNN填充缺失值 # 加载库 import numpy as np from fancyimpute import KNN from sklearn.preprocessing import StandardScaler from sklearn.datasets import make_blobs # 创建模拟特征矩阵 features...

    python_通过KNN来填充缺失值

    
    # 加载库
    import numpy as np
    from fancyimpute import KNN
    from sklearn.preprocessing import StandardScaler
    from sklearn.datasets import make_blobs
    
    # 创建模拟特征矩阵
    features, _ = make_blobs(n_samples = 1000,
                             n_features = 2,
                             random_state = 1)
    
    # 标准化特征
    scaler = StandardScaler()
    standardized_features = scaler.fit_transform(features)
    standardized_features
    # 制造缺失值
    true_value = standardized_features[0,0]
    standardized_features[0,0] = np.nan
    standardized_features
    # 预测
    features_knn_imputed = KNN(k=5, verbose=0).fit_transform(standardized_features)
    # features_knn_imputed = KNN(k=5, verbose=0).complete(standardized_features)
    features_knn_imputed
    # #对比真实值和预测值
    print("真实值:", true_value)
    print("预测值:", features_knn_imputed[0,0])
    # 加载库
    import numpy as np
    from fancyimpute import KNN
    from sklearn.preprocessing import StandardScaler
    from sklearn.datasets import make_blobs
    ​
    # 创建模拟特征矩阵
    features, _ = make_blobs(n_samples = 1000,
                             n_features = 2,
                             random_state = 1)# 标准化特征
    scaler = StandardScaler()
    standardized_features = scaler.fit_transform(features)
    standardized_features
    # 制造缺失值
    true_value = standardized_features[0,0]
    standardized_features[0,0] = np.nan
    standardized_features
    # 预测
    features_knn_imputed = KNN(k=5, verbose=0).fit_transform(standardized_features)
    # features_knn_imputed = KNN(k=5, verbose=0).complete(standardized_features)
    features_knn_imputed
    # #对比真实值和预测值
    print("真实值:", true_value)
    print("预测值:", features_knn_imputed[0,0])
    真实值: 0.8730186113995938
    预测值: 1.0955332713113226
    
    展开全文
  • KNN估计数据缺失值填充KNN估计一、基本思想二、步骤1.导入数据2.查看空缺值3.取出要分析的数据4.计算平均值5.计算标准差6.规范化7.计算欧几里得距离8.最优解9.画图总结 数据缺失值填充KNN估计 学生一枚 一、...


    数据缺失值填充—KNN估计

    运行环境
    python3.6
    jupyter notebook

    一、基本思想

    先将数据标准化,然后对缺失值的数据点做k邻近填充,计算含缺失值的数据点与其他不含缺失值的数据点的距离矩阵,选出欧氏距离最近的k个数据点。
    用选中的k个近邻的数据点对应的字段均值来填充数据中的空缺值。
    

    二、步骤

    1.导入数据

    import pandas as pd
    data = pd.read_csv('iris-带空格数据.csv')
    data['id'] = [i for i in range(0,150)]		#加入id列
    

    2.查看空缺值

    index = [] #存放空缺值的位置
    for i in data.columns:
        a=data[data[i] == ' '].index.tolist()
        index.append(a)
    index#一共有七列数据,空缺值在第5列,第三行
    

    输出结果为:[[], [], [], [], [2], [], []]

    3.取出要分析的数据

    data.iloc[2,4] = 0 #将空值变为0
    new_data = data.iloc[:,1:4]#计算空缺值只需要前三列数据
    
    

    4.计算平均值

    #平均值
    avg =[]#用来存放平均值
    for i in new_data.columns:#遍历dataframe列名
        a = new_data[i].values.tolist()#取出每一列的数据,转成列表
        sum = 0
        for i in range(0,len(a)):
            sum = sum + float(a[i])#求每一列数据之和
        avg.append(sum/len(a))#求平均
    avg
    
    

    结果为:[1.199333333333334, 3.7580000000000027, 3.057333333333334]

    5.计算标准差

    #标准差
    all_value=[]
    for i in new_data.columns:
        a = new_data[i].values.tolist()#每一列的数据转成列表
    all_value.append(a)#每一列的列表加入到all_value
    biaozhuncha = []
    for i in range(0,new_data.shape[1]):#一共三列,所以遍历三次。
        sum = 0
        for j in all_value[i]:
            sum = sum + ((float(j)-avg[j])*(float(j)-avg[j]))#计算每一列数据减去对应列的平均值的平方之和
        b = (sum/new_data.shape[0]) ** 0.5#计算每一列数据的标准差
        biaozhuncha.append(b)#把标准差加入到biaozhuncha列表中
    biaozhuncha
    
    

    在这里插入图片描述

    6.规范化

    #z_score规范化
    result = []
    for i in range(0,new_data.shape[1]):#遍历三次,因为有三列数据
        z_score=[]
        for j in all_value[i]:#all_value列表,就是上面用到了存放所有列数据的二维列表
            c = (float(j)-avg[i])/biaozhuncha[i]#计算出某一列规范化后的结果
            z_score.append(c)#结果保存在z_score列表中
    result.append(z_score)#把三列的结果汇总
    new_data['Petal_width'] = result[0]#接着,把规范化得到的结果替换new_data中的值
    new_data['Petal_length'] = result[1]
    new_data['Sepal_width'] = result[2]
    
    

    7.计算欧几里得距离

    value_result=[]
    for i in new_data.columns:
        lie_value = []
        for j in new_data[i].values.tolist():
            lie_value.append(j)
        value_result.append(lie_value)
    #此处,将上面得到的规范化结果保存成二位列表,方便后面的计算。
    d_list=[]
    for i in range(0,new_data.shape[0]):
        d = 0
        for j in range(0,new_data.shape[1]):
            d = d+((new_data.iloc[i,j]-new_data.iloc[2,j])*(new_data.iloc[i,j]-new_data.iloc[2,j]))
        d_list.append(d**0.5) result = d_list
    df = pd.DataFrame(d_list)#将结果转成dataframe方便我排序。
    
    

    8.最优解

    all_data_result = []
    for i in range(3,20):
        all_data=[]
        for j in df.drop(2).sort_values(by=0).head(i).index:
            all_data.append(data.iloc[j,4])
        #print(all_data)
    all_data_result.append(all_data)
    b_list = []
    for i in range(len(all_data_result)):
        sum = 0
        for j in all_data_result[i]:
            sum = sum + float(j)
        b = sum/len(all_data_result[i])
    b_list.append(b)
    
    

    在这里插入图片描述

    9.画图

    对3到50的预测结果进行可视化。
    import matplotlib.pyplot as plt
    %matplotlib inline
    #把图插在网页里
    plt.plot([i for i in range(3,50)],b_list)
    在这里插入图片描述

    总结

    本次实验学习到了很多关于dataframe的操作,有一些对于列表的操作我不是很熟练,但是我可以把列表转成dataframe类型在进行操作。此外,我也很少调用一些对数据计算的函数,让我更加了解到计算平均、标准差和欧几里得距离的方法。对于k-means的算法也有了一定的认识,可以使用一些基本的方法来预测数据并填充空缺值。
    数据和源码:链接:https://pan.baidu.com/s/1TPwte04gxkk0Rmna6BQ6iw
    提取码:1025

    展开全文
  • Pandas+Knn 数据预处理:填充缺失值

    千次阅读 2020-11-02 15:52:12
    处理思路:预测填充缺失值 因为涉及到跟时间有关,技术太菜,不会利用LSTM或者RNN等来预测缺失的数据值,于是就想到KNN算法的设计思想,将所有的指标都当做距离计算的一部分,这里的时间由于是2020-01-02 20:00:00的...

    原始数据与待处理问题

    原始数据如图:pm10列存在很多缺失的数据,同时跟时间和站点有关系,所以不能用直接求均值或者众数或者直接删除的方法来填充pm10的缺失值。在这里插入图片描述

    处理思路:预测填充缺失值

    因为涉及到跟时间有关,技术太菜,不会利用LSTM或者RNN等来预测缺失的数据值,于是就想到KNN算法的设计思想,将所有的指标都当做距离计算的一部分,这里的时间由于是2020-01-02 20:00:00的格式,使用了字符串切片和根据index替换的方式把日期格式改为:20010220(因为时间格式都是一样的年月日整点时间),站点数据用1,2,3,4,5来代替。

    #先做时间处理和站点处理
    data['datetime']=data['datetime'].str.slice(2,13)
    data['datetime']=data['datetime'].str.replace('-','')
    data['datetime']=data['datetime'].str.replace(' ','')
    data['siteid']=data['siteid'].str.replace('A','')
    print(data.head(10))
    

    处理后的数据:
    在这里插入图片描述
    这里参考了KNN填充思路
    其中,x是排除了需要填充列的数据,又排除了行为空的数据;y是保留需要填充列中不为空的数据;test是需要填空列中为空,再排除需要填充列之后的数据(这部分描述可能看不懂,参考链接仔细对比)。
    填充方法实现:``

    import pandas as pd
    from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor
    #参数说明:dispersed为True代表是离散数据,则采用Knn分类器,为False代表是连续数据,则采用Knn回归器
    def knn_missing_filled(x_train,y_train,test,k=5,dispersed=False):
        if dispersed:
            clf=KNeighborsClassifier(n_neighbors=k,weights="distance")
        else:
            clf=KNeighborsRegressor(n_neighbors=k,weights="distance")
        clf.fit(x_train,y_train)
        return test.index,clf.predict(test)
    

    这里需要注意的是,输入数据不管是x_train,y_train还是test里面都不能包含空值,如果有空值则需要先对这部分数据处理。我的数据集中没有满足同时两个及以上属性为空的,所以先将它们删除了之后进行训练填充,得到了填充的数据之后再合并数据集。

    #删除其他列(排除要填充的列)中存在空值的行,并保存删除的数据。删除了232行数据
    deleteData=data[(data['pm25'].isnull()) | (data['so2'].isnull()) | (data['o3'].isnull()) | (data['co'].isnull()) | (data['no2'].isnull())]
    deleteData.to_csv('E:/ljcJupter/forecastWeather/deleteData_test_s5_aqi.csv')
    data=data.dropna(axis=0,how='any',subset=['pm25'])
    data=data.dropna(axis=0,how='any',subset=['so2'])
    data=data.dropna(axis=0,how='any',subset=['o3'])
    data=data.dropna(axis=0,how='any',subset=['co'])
    data=data.dropna(axis=0,how='any',subset=['no2'])
    

    后续代码:

    print('-----final data-------')
    print(data.head(10))
    #index,value=knn_missing_filled()
    #x_train=data[['datetime','siteid','pm25','so2','o3','co','no2']]
    x_train=data[data['pm10'].notnull()].loc[:,['datetime','siteid','pm25','so2','o3','co','no2']]
    #y_train=data.loc[data.isnull().any(axis=1)]
    #y_train=data[data['pm10'].notnull()]
    y_train=data[data['pm10'].notnull()]['pm10']
    #test=data.loc[data.isnull().any(axis=1)]
    test=data[data['pm10'].isnull()].loc[:,['datetime','siteid','pm25','so2','o3','co','no2']]
    print('---------xtrain----------')
    print(x_train)
    print('---------ytrain----------')
    print(y_train)
    print('---------test----------')
    print(test)#不能使用这个方法(此时),因为其他五个属性后面都存在空值
    index,value=knn_missing_filled(x_train,y_train,test,k=5,dispersed=False)
    print(index)
    print('------value--------')
    print(value)
    #根据返回的index和填充的value值
    data.loc[index,'pm10']=value
    
    展开全文
  • 常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。 1. 数据集介绍 数据...

    面试不仅仅是一个找工作的过程,还是一个向面试官交流学习的过程。之前的某次面试中,聊到了缺失值填充方法,经面试官指点学到了一些技能,下面简要总结一下。

    常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。

    1. 数据集介绍

    数据集来源于 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测。该数据集共有1000条数据,特征共83维,加上id和label共85列,每维特征缺失数量范围为0~911。为了简单比较各种填充方法的效果,我们选取最简单的二分类模型(逻辑回归),选取F1 score作为评测指标。

    读取数据集代码如下:

    1. train_data = pd.read_csv('train_data.csv', encoding='gbk') # 读取数据集
    2. filter_feature = ['id','label'] # 过滤无用的维度
    3. features = []
    4. for x in train_data.columns: # 取特征
    5. if x not in filter_feature:
    6. features.append(x)
    7. train_data_x = train_data[features]
    8. train_data_y = train_data['label']
    9. X_train, X_test, y_train, y_test = train_test_split(train_data_x, train_data_y, random_state=1) # 划分训练集、测试集

    2. 常见的填充方法

    (1)填充固定值

    选取某个固定值/默认值填充缺失值。

    train_data.fillna(0, inplace=True) # 填充 0

    (2)填充均值

    对每一列的缺失值,填充当列的均值。

    train_data.fillna(train_data.mean(),inplace=True) # 填充均值

    (3)填充中位数

    对每一列的缺失值,填充当列的中位数。

    train_data.fillna(train_data.median(),inplace=True) # 填充中位数

    (4)填充众数

    对每一列的缺失值,填充当列的众数。由于存在某列缺失值过多,众数为nan的情况,因此这里取的是每列删除掉nan值后的众数。

    1. train_data.fillna(train_data.mode(),inplace=True) # 填充众数,该数据缺失太多众数出现为nan的情况
    2. features_mode = {}
    3. for f in features:
    4. print f,':', list(train_data[f].dropna().mode().values)
    5. features_mode[f] = list(train_data[f].dropna().mode().values)[0]
    6. train_data.fillna(features_mode,inplace=True)

    (5)填充上下条的数据

    对每一条数据的缺失值,填充其上下条数据的值。

    1. train_data.fillna(method='pad', inplace=True) # 填充前一条数据的值,但是前一条也不一定有值
    2. train_data.fillna(0, inplace=True)
    3. train_data.fillna(method='bfill', inplace=True) # 填充后一条数据的值,但是后一条也不一定有值
    4. train_data.fillna(0, inplace=True)

    (6)填充插值得到的数据

    用插值法拟合出缺失的数据,然后进行填充。

    1. for f in features: # 插值法填充
    2. train_data[f] = train_data[f].interpolate()
    3. train_data.dropna(inplace=True)

    (7)填充KNN数据

    填充近邻的数据,先利用knn计算临近的k个数据,然后填充他们的均值。(安装fancyimpute)除了knn填充,fancyimpute还提供了其他填充方法。

    1. from fancyimpute import KNN
    2. train_data_x = pd.DataFrame(KNN(k=6).fit_transform(train_data_x), columns=features)

    (8)填充模型预测的值

    把缺失值作为新的label,建立模型得到预测值,然后进行填充。这里选择某个缺失值数量适当的特征采用随机森林RF进行拟合,其他缺失特征采用均值进行填充。

    1. new_label = 'SNP46'
    2. new_features = []
    3. for f in features:
    4. if f != new_label:
    5. new_features.append(f)
    6. new_train_x = train_data[train_data[new_label].isnull()==False][new_features]
    7. new_train_x.fillna(new_train_x.mean(), inplace=True) # 其他列填充均值
    8. new_train_y = train_data[train_data[new_label].isnull()==False][new_label]
    9. new_predict_x = train_data[train_data[new_label].isnull()==True][new_features]
    10. new_predict_x.fillna(new_predict_x.mean(), inplace=True) # 其他列填充均值
    11. new_predict_y = train_data[train_data[new_label].isnull()==True][new_label]
    12. rfr = RandomForestRegressor(random_state=666, n_estimators=10, n_jobs=-1)
    13. rfr.fit(new_train_x, new_train_y)
    14. new_predict_y = rfr.predict(new_predict_x)
    15. new_predict_y = pd.DataFrame(new_predict_y, columns=[new_label], index=new_predict_x.index)
    16. new_predict_y = pd.concat([new_predict_x, new_predict_y], axis=1)
    17. new_train_y = pd.concat([new_train_x, new_train_y], axis=1)
    18. new_train_data = pd.concat([new_predict_y,new_train_y])
    19. train_data_x = new_train_data[features]
    20. train_data_y = train_data['label']

    3. 实验对比

    (1)评测指标

    选取F1 score进行评测。

    1. def countF1(train, predict):
    2. count = 0 # 统计预测的正确的正样本数
    3. for i in range(len(train)):
    4. if predict[i] == 1 and train[i] == 1:
    5. count += 1
    6. pre = count * 1.0 / sum(predict) # 准确率
    7. recall = count * 1.0 / sum(train) # 召回率
    8. return 2 * pre * recall / (pre + recall)

    (2)对比结果

    填充方式训练集_F1测试集_F1
    默认值00.705167170.59689922
    均值(mean)0.701863350.67768595
    中位数(median)0.708268330.67479675
    众数(mode)0.704791340.68852459
    上一个数据(pad)0.704097120.62711864
    下一个数据(bfill)0.669811320.60169492
    插值0.690184050.61333333
    KNN_30.710769230.66393443
    KNN_60.708978330.68852459
    KNN_100.704791340.68032787
    随机森林_feature30.5714285710.4
    随机森林_feature460.5851393190.41509434

    (3)实验小结

    对于缺失值的处理,除了直接删除缺失严重的特征外,还可以选择各种各样的填充方法。对于每一种填充方式而言,都有其适用的场景,没有绝对的好坏之分,因此在做数据预处理时,要多尝试几种填充方法,选择表现最佳的即可。

     

    本文完整代码已上传至git(https://github.com/AHNU/fill_missing_values)

    参考文献

    1. 训练模型填充空值(fill null)的几种方法

    2. https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python

    展开全文
  • KNN算法解决缺失值问题

    万次阅读 2018-11-14 18:15:56
    它根据KNN算法找到任何案例最近的k个邻居,在K在最近邻案例中通过设定函数值(一般会选取均值、中位数、众数等)来填充缺失值。使用方法如下: algae<-knnImputation(algae,k=10,meth="median") % ...
  • fancyimpute库为一个功能较强大的补全空缺值的函数库,集成了很多方式,包括均值、众数、频数填充,KNN填充、MCMC填充等,现将安装过程中遇到的那些坑,以及最后用KNN进行缺失值填充的过程总结如下: 首先我试了网上...
  • •SimpleFill: Replaces missing entries with the mean or median of each...•KNN: Nearest neighbor imputations which weights samples using themean squared difference on features for which two rows bot...
  • 缺失值填充的几种方法

    万次阅读 多人点赞 2018-09-12 22:59:51
    常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。 1. 数据集介绍 数据...
  • 在数据挖掘工作中,处理样本中的缺失值是必不可少的一步。其中对于缺失值插补方法的选择至关重要,因为它会对最后模型拟合的效果产生重要影响。在2019年底,scikit-learn发布了0.22版本,此次版本除了修复之前的一些...
  • 处理缺失的数据并不是一件容易的事,本篇介绍了在Python中使用KNN算法处理缺失的数据,希望对Python有更深入的了解,以及对Python的相关学习有所帮助。处理缺失的数据并不是一件容易的事。 方法的范围从简单的均值...
  • Machine_Learning-Housing_grade_... 我们使用KNN插补来自动填充缺失的位置,以进行更好的预测。 用于对训练和测试数据集进行预测的模型是SVM。 使用线性核获得的模型的准确性约为88.6%,比rbf的准确性高23%。
  • python缺失值填充的几种方法

    万次阅读 多人点赞 2019-06-14 10:37:41
    常见的数据缺失填充方式分为很多种,比如删除法、均值法、回归法、KNN、MICE、EM...比如fancyimpute中集成了很多方式,包括均值、众数、频数填充,KNN填充、MCMC填充等。 一、直接填充 data = pd.read_csv(path,enco...
  • 数据分析--缺失值填充的几种方法

    千次阅读 2020-03-18 16:57:09
    常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。 1 数据集介绍: 数据集...
  • 在python中使用KNN算法处理缺失的数据 处理缺失的数据并不是一件容易的事。 方法的范围从简单的...正如标题所示,我们不会将算法用于分类目的,而是填充缺失值。 本文将使用房屋价格数据集,这是一个简单而著名的数据
  • 特征工程之缺失值处理

    千次阅读 2020-04-16 09:45:38
    文章目录缺失值处理直接删除统计值填充统一值填充前后向值填充插值法填充预测填充KNN填充具体分析缺失数据可视化微信公众号:邯郸路220号子彬院 获取更多内容 缺失值处理 一般来说,未经处理的原始数据中通常会存在...
  • 缺失值处理直接删除统计值填充统一值填充前后向值填充插值法填充预测填充KNN填充具体分析缺失数据可视化缺失值处理一般来说,未经处理的原始数据中通常会存在缺失值、离群值等,因此在建模训练之前需要处理好缺失值...
  • 缺失值处理直接删除统计值填充统一值填充前后向值填充插值法填充预测填充KNN填充具体分析缺失数据可视化缺失值处理一般来说,未经处理的原始数据中通常会存在缺失值、离群值等,因此在建模训练之前需要处理好缺失值...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
关键字:

knn填充缺失值