一、属性规约
在进行数据预处理的过程中,如果数据的某一列都是一样的或者属性是一样的,那么这一列对我们的预测没有帮助,应该将这一列去掉,pandas中如果某一列属性值相同,但是此列中有缺失值(NaN),pandas会默认其有两个属性,我们在进行此操作的过程中应该首先去掉缺失值,然后检查唯一性。代码如下;
orig_columns = loans_2007.columns drop_columns = [] for col in orig_columns: col_series = loans_2007[col].dropna().unique() if len(col_series) == 1: drop_columns.append(col) loans_2007 = loans_2007.drop(drop_columns, axis=1)
二、缺失值
用下面的代码进行缺失值查看数据中每一列的缺失值情况,对于缺失值比较多的列,可以直接删除,对于缺失值比较少的列可以删除其样本,或者填充其他值代替。
null_counts = loans.isnull().sum()
缺失值处理方法:
beh_tgt_mergeA.dropna(how='all') #dropna默认丢弃任何含有缺失值的行,传入how='all'则之丢弃全为NaN的行或列 beh_tgt_mergeA.dropna(how='all',axis=1) #丢弃列 beh_tgt_mergeA.dropna(thresh=3) #另一个参数是thresh,该参数的类型为整数,thresh=3,会在一行中至少有 3 个非 NA 值时将其保留。 beh_tgt_mergeA.dropna(axis=1,thresh=3) #保留至少存在3个非NaN的列
df.dropna(subset=['C']) # 只有当NaN出现在特定列(这里:“C”)时,才会删除行。
np.random.seed(1234)
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
d1.count() #非空元素计算
d1.min() #最小值
d1.max() #最大值
d1.idxmin() #最小值的位置,类似于R中的which.min函数
d1.idxmax() #最大值的位置,类似于R中的which.max函数
d1.quantile(0.1) #10%分位数
d1.sum() #求和
d1.mean() #均值
d1.median() #中位数
d1.mode() #众数
d1.var() #方差
d1.std() #标准差
d1.mad() #平均绝对偏差
d1.skew() #偏度
d1.kurt() #峰度
d1.describe() #一次性输出多个描述性统计指标
对于一批数据来说,如果缺失值在40%~60%之间的话,可以将是否缺失作为一个特征;如果缺失超过70%,其实可以将这个特征删除,缺失值在20%~30%的,对于数值型数据,可以将填充众数,对于类别型数据,可以填充最多的类别。
三、字符转化
print(loans.dtypes.value_counts())
object_columns_df = loans.select_dtypes(include=["object"]) #选择字符型的属性
用上面的代码看每一列的属性,sklearn不能处理字符型的,只能接受数值型的。对于字符型的可以进行如下处理:
mapping_dict = { "emp_length": { "10+ years": 10, "9 years": 9, "8 years": 8, "7 years": 7, "6 years": 6, "5 years": 5, "4 years": 4, "3 years": 3, "2 years": 2, "1 year": 1, "< 1 year": 0, "n/a": 0 } } loans = loans.replace(mapping_dict) loans = loans.drop(["last_credit_pull_d", "earliest_cr_line", "addr_state", "title"], axis=1) loans["int_rate"] = loans["int_rate"].str.rstrip("%").astype("float")
对于能枚举的可以做一个字典,然后对数据做一个replace,对于有“%”的列,可以直接去掉百分号就好了。
四、样本不均衡问题
1、数据增强
2、加权重项
(1)(lr = LogisticRegression(class_weight="balanced"))
(2)自己设置,传到class_weight中如下:
penalty = { 0: 5, 1: 1 } lr = LogisticRegression(class_weight=penalty)
3、多个模型融合