python数据建模数据预处理_python数据特征预处理

一、属性规约

在进行数据预处理的过程中,如果数据的某一列都是一样的或者属性是一样的,那么这一列对我们的预测没有帮助,应该将这一列去掉,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()

缺失值处理方法:

参考:https://www.zhihu.com/question/26639110

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.isnan(appdata).any()

# 第二种

app_train.isnull().sum()

# 第三种

cols = avg_buro.columns

for col in cols:

if avg_buro[col].isnull().sum() != 0:

print(col)

print('No Missing')

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()#一次性输出多个描述性统计指标

缺失值填充的几种方法:

# 均值填充

selectdata1['beta'] = selectdata1['beta'].fillna(selectdata1['beta'].mean())

# 众数填充

selectdata1['beta'] = selectdata1['beta'].fillna(selectdata1['beta'].mode())

# 前一个数填充

selectdata1['beta'] = selectdata1['beta'].fillna(method='pad')

#后一个数填充

selectdata1['beta']=selectdata1['beta'].fillna(method='bfill')

#插值填充

selectdata1['beta']=selectdata1['beta'].interpolate()

对于一批数据来说,如果缺失值在40%~60%之间的话,可以将是否缺失作为一个特征;如果缺失超过70%,其实可以将这个特征删除,缺失值在20%~30%的,对于数值型数据,可以将填充众数,对于类别型数据,可以填充最多的类别。

data['EMI_Loan_Submitted_Missing'] = data['EMI_Loan_Submitted'].apply(lambda x: 1 if pd.isnull(x) else 0)

三、字符转化

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、多个模型融合

五、删除指定行

filtered1_beh_tgt_mergeA[(filtered1_beh_tgt_mergeA['var1639'].isin([121505.0,121504.0]))]

test = list(filtered1_beh_tgt_mergeA.var1639)

test.remove(121505.0)

test.remove(121504.0)

filtered1_beh_tgt_mergeA = filtered1_beh_tgt_mergeA[filtered1_beh_tgt_mergeA.var1639.isin(test)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中进行数学建模国赛数据预处理的一般步骤如下: 1. 导入所需的Python库,如numpy、pandas等,使用这些库来处理数据。 2. 使用pandas库中的read_csv()函数读取原始数据文件,并将其存储在一个DataFrame对象中。 3. 对数据进行初步的探索性分析,包括查看数据的基本信息、处理缺失值、处理异常值等。 4. 进行数据清洗和转换。这包括去除重复值、处理缺失值(可以使用fillna()函数或dropna()函数)、将数据转换为合适的格式(例如将字符串转换为数值型数据)。 5. 对数据进行特征工程。这包括选择和构建适当的特征,例如通过创建新的特征、进行特征缩放或者进行特征选择。 6. 对需要处理的数据进行预处理的方法有很多种,其中一种常见的方法是使用sklearn库中的预处理方法,比如StandardScaler进行数据标准化、MinMaxScaler进行数据归一化等。 7. 最后,根据具体的建模需求,将数据划分为训练集和测试集,用于模型的训练和评估。 需要注意的是,具体的数据预处理步骤可能会因具体问题而异,可以根据实际情况进行相应的调整和扩展。此外,可以参考引用中提到的全国国赛美赛研究生华为杯数学建模竞赛练习使用的方法,以及引用和引用中提到的GitHub链接,获取更详细的代码和论文。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值