风控模型demo

#拉格朗日插值法
from scipy.interpolate import lagrange
def Lagrange(df,col):
def polyinterp_column(s,n,k=5):
#取该缺失值的前后五个值作为参数
y = s[list(range(n-k,n))+list(range(n+1,n+1+k))]
y = y[y.notnull()] #去除空值
return lagrange(y.index,list(y))(n)
#逐个判断是否需要插值
for i in range(len(df)):
if (df[i].isnull())[i]:
df[col][i] = polyinterp_column(df[col],i)
return df[col]
#数值型类型特征的方差分析法去除特征
import numpy as np
import pandas as pd
def Variance(df,col):
arr = np.array(df[col])
#这里取方差小于1的删除
if arr.var()<1:
del df[col]
return df
from sklearn.cluster import KMeans
def KmeansAbnormal(df,k,spec):
"""
:param df: 传入的数据
:param k: 聚类中心个数
:param sep: 阈值
:return: 返回去除异常值后的数据
"""
data = df.copy()
# 将数据进行标准化
data = 1.0 * (data - data.mean()) / data.median()
# 建立聚类模型
km = KMeans(n_clusters=k, max_iter=200)
km.fit_transform(data)
# 添加类别列
data["center"] = [np.array(km.cluster_centers_[i]) for i in km.labels_]
#计算每个样本到对应聚类中心距离
norm_lis = []
for i in range(data.shape[0]):
norm = np.array(data.loc[i][data.columns[:-1]]) - data.loc[i]["center"]
norm = np.linalg.norm(norm)
norm_lis.append(norm)
data["distance"] = norm_lis
data["categorical"] = km.labels_
#计算每个聚类中心的平均距离
avergae_distance = []
for i in range(k):
avergae_distance.append(data["distance"][data["categorical"] == i].mean())
# 计算每个样本点到中心的距离与该中心平均距离的比值
data["spec"] = [data.iloc[i]["distance"] / avergae_distance[data.iloc[i]["categorical"]] for i in range(data.shape[0])]
#保留小于阈值的数据
df = df[data["spec"] < spec]
return df

猜你喜欢

转载自www.cnblogs.com/daguonice/p/11420240.html