import pandas as pd
import numpy as npdf = pd.read_csv('diabetes.csv')def preprocess(df):print('----------------------------------------------')print("Before preprocessing")print("Number of rows with 0 values for each variable")#遍历每一列for col in df.columns: #该列值为0的数量missing_rows = df.loc[df[col] == 0].shape[0]print(col + ": " + str(missing_rows))print('----------------------------------------------')df = preprocess(df)
输出结果:
----------------------------------------------
Before preprocessing
Number of rows with 0 values for each variable
Pregnancies: 111
Glucose: 5
BloodPressure: 35
SkinThickness: 227
Insulin: 374
BMI: 11
DiabetesPedigreeFunction: 0
Age: 0
Outcome: 500
----------------------------------------------
1.先看看每一列值为零的情况
通过常识可以知道,这些值是不合理的。这表明数据集中有缺失值。
对于缺失值的处理:
- 移除(丢弃)任何含有0的行;
- 使用非0的平均数/中位数/众数来替换缺失值;
- 使用另外的机器学习模型来预测这些数据的真实值;
2.我们在这里采用非0值的平均数来代替缺失值
首先,用NaN来替换Glucose、BloodPressure、SkinThickness、Insulin、BMI中的0。这样pandas 就知道这些是非法值。
import pandas as pd
import numpy as npdf = pd.read_csv('diabetes.csv')def preprocess(df):print('----------------------------------------------')print("Before preprocessing")print("Number of rows with 0 values for each variable")#遍历每一列for col in df.columns: #该列值为0的数量missing_rows = df.loc[df[col] == 0].shape[0]print(col + ": " + str(missing_rows))print('----------------------------------------------')#使用NaN来替换0df['Glucose'] = df['Glucose'].replace(0, np.nan)df['BloodPressure'] = df['BloodPressure'].replace(0, np.nan)df['SkinThickness'] = df['SkinThickness'].replace(0, np.nan)df['Insulin'] = df['Insulin'].replace(0, np.nan)df['BMI'] = df['BMI'].replace(0, np.nan)#平均数来代替缺失值df['Glucose'] = df['Glucose'].fillna(df['Glucose'].mean())df['BloodPressure'] = df['BloodPressure'].fillna(df['BloodPressure'].mean())df['SkinThickness'] = df['SkinThickness'].fillna(df['SkinThickness'].mean())df['Insulin'] = df['Insulin'].fillna(df['Insulin'].mean())df['BMI'] = df['BMI'].fillna(df['BMI'].mean())df = preprocess(df)
完成上面的缺失值处理以后,接下来做 数据标准化 处理。
3.数据标准化处理的目的是对数值类型的变量进行变换,使其均值为0 并具有单位方差。
数据标准化的另外一个积极作用是它可以收缩变量的量级,将其变换到更均衡的范围。因为在训练模型时,范围大的变量相对范围小的变量会占据主导地位,这样会过分强调范围大的变量,我们不希望这种情况发生的。
整个过程如下:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn import preprocessingdef preprocess(df):print('----------------------------------------------')print("Before preprocessing")print("Number of rows with 0 values for each variable")for col in df.columns:missing_rows = df.loc[df[col]==0].shape[0]print(col + ": " + str(missing_rows))print('----------------------------------------------')# Replace 0 values with the mean of the existing valuesdf['Glucose'] = df['Glucose'].replace(0, np.nan)df['BloodPressure'] = df['BloodPressure'].replace(0, np.nan)df['SkinThickness'] = df['SkinThickness'].replace(0, np.nan)df['Insulin'] = df['Insulin'].replace(0, np.nan)df['BMI'] = df['BMI'].replace(0, np.nan)df['Glucose'] = df['Glucose'].fillna(df['Glucose'].mean())df['BloodPressure'] = df['BloodPressure'].fillna(df['BloodPressure'].mean())df['SkinThickness'] = df['SkinThickness'].fillna(df['SkinThickness'].mean())df['Insulin'] = df['Insulin'].fillna(df['Insulin'].mean())df['BMI'] = df['BMI'].fillna(df['BMI'].mean())print('----------------------------------------------')print("After preprocessing")print("Number of rows with 0 values for each variable")for col in df.columns:missing_rows = df.loc[df[col]==0].shape[0]print(col + ": " + str(missing_rows))print('----------------------------------------------')# Standardizationdf_scaled = preprocessing.scale(df)df_scaled = pd.DataFrame(df_scaled, columns=df.columns)df_scaled['Outcome'] = df['Outcome']df = df_scaledreturn dfdf = pd.read_csv('diabetes.csv')
df = preprocess(df)
preprocessing.scale(df)
这一句就可以完成数据的标准化,输出结果df_scaled已经不是dataframe类型,需要转回dataframe 类型 。
Outcome列是数据的输出结果,不需要标准化的。
自此已经完成预处理了。
一些基础:
1.在Pandas中,使用df.loc来访问某个DataFrame中的行和列的数据。其基本语法为:df.loc[row_indexer, column_indexer]。其中,row_indexer可以是一个单独的标签,也可以是一组标签;column_indexer可以是一个单独的标签,也可以是一组标签。如果不指定row_indexer,则会返回所有行的数据;如果不指定column_indexer,则会返回所有列的数据。
2.可以使用一些布尔条件来访问DataFrame中的数据。具体来说,可以创建一组布尔条件,然后使用这组条件来筛选出符合条件的行或列。代码示例如下:
df.loc[df[col] == 0] 其中df[col] == 0就是某列满足这个条件,也就是结果为True的行
df.shape[0] 即为行数
df.shape[1] 为列数
参考:
df.loc的详细解析_笔记大全_设计学院 (python100.com)
python神经网络项目实战