取自《Python数据分析与挖掘实战》一书,整理各个项目中用到的数据处理方法:
数据预处理方法建立模型方法绘制图形对于分类问题:用模型分类;混淆矩阵及其绘图;观测其ROC曲线; 对于聚类问题:划分类目数;获取划分类目中心;平行坐标系描述
在获取数据之后,会发现一些数据值错误 一、填补空值 二、观察数据分布 三、数据清洗,使数据值都合理存在 四、数据规约,提取重要属性 五、数据归一化,为了使用K-Means算法
绘制折线图,观测电量下降趋势。
通过数据探索,发现异常值,不合逻辑的错误值,如果数据集很大就可以丢弃,否则可以填充
explore = data.describe(include='all').T explore['null'] = len(data) - explore['count'] explore = explore[['null', 'max', 'min', 'std']]# count,unique,top,freq,mean,std,min,50%,max等选取几个属性 #计算相关系数矩阵,data必须是n*n矩阵 print(np.round(data.corr(method='pearson'), 2))类似集合的操作,对于不合逻辑的错误值,设置索引,排除。
data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] index1 = data['SUM_YR_1'] != 0 index2 = data['SUM_YR_2'] != 0 index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0) data = data[index1 | index2 | index3]数据的规约就是选取有用的数据属性,可以通过excel删除对应列即可实现。
# 选取某列 data=data[data['TARGET_ID']==184].copy() #获取该条件下的数据的副本 data_group=data.groupby('COLLECTTIME') #以时间分组 def attr_trans(x): # 定义属性变换函数 #创建新的series result=pd.Series(index=['SYS_NAME', 'CWXT_DB:184:C:\\', 'CWXT_DB:184:D:\\', 'COLLECTTIME']) #设置列标 result['SYS_NAME'] = x['SYS_NAME'].iloc[0] #获取该属性值,唯一 result['COLLECTTIME'] = x['COLLECTTIME'].iloc[0] #获取该属性值,唯一 result['CWXT_DB:184:C:\\'] = x['VALUE'].iloc[0] #获取属性值A result['CWXT_DB:184:D:\\'] = x['VALUE'].iloc[1] #获取属性值B,等等 return result data_processed = data_group.apply(attr_trans) # 逐组处理使用正态分布的标准正态分布标准化:x-u/σ
data = (data - data.mean(axis=0)) / data.std(axis=0) # 按列选取均值和标准差。矩阵操作当发现数值范围对结果影响太大,不方便运算时,将数据标准化
data=(data-data.min())/(data.max()-data.min()) data=data.reset_index()应用在发掘频繁项时,需要把连续数据转变为离散数据。
for i in range(len(keys)): # 调用k-means算法,进行聚类离散化 r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]]) # 聚类中心,A r2 = pd.Series(kmodel.labels_).value_counts() # 分类统计 r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'n']) #统计量, An r = pd.DataFrame(pd.concat([r1, r2], axis=1)) #聚类中心与类别数目匹配连接 r = r.sort_values(typelabel[keys[i]]) r.index = [1, 2, 3, 4] r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]], 2) # rolling_mean()用来计算相邻2列的均值,以此作为边界点。 r[typelabel[keys[i]]][1] = 0.0 # 这两句代码将原来的聚类中心改为边界点。 result = result.append(r.T) #转置添加 result = result.sort_index() # 以Index(A,B,C,D,E,F)顺序排序,保存 result.to_excel(processedfile)1. 一阶颜色矩:采用一阶原点矩,反应图像的整体明暗程度 Ei=1/N * ∑(j:1-N) Pij 2. 二阶颜色矩:反应图像颜色的分布范围 σi=(1/N *∑j:1-N (Pij-Ei)^2) ^1/2 3. 三阶颜色矩:反应图像颜色分布的对称性
利用时间序列算法模型的流程,根据历史数据,来预测未来的数据情况 采用时间序列算法对模型输入数据进行模型拟合、检验与检测。依据误差公式,计算预测值与验证数据之间的误差,分析其是否属于业务接受的范围内。 模型识别AR,MA,ARMA 平稳性检验,白噪声检验,模型识别,模型检验,模型预测,模型评价,模型应用
连接数据库 系统过滤算法为主,其他为辅。
物品相似度:夹角余弦;杰卡德相似系数;相关系数 熟悉基于物品的协同过滤算法使用
# 基于物品的协同过滤算法 def Jaccard(a, b): return 1.0 * (a * b).sum() / (a + b - a * b).sum() class Recommender(): sim = None def similarity(self, x, distance): y = np.ones((len(x), len(x))) for i in range(len(x)): for j in range(len(x)): y[i, j] = distance(x[i], x[j]) return y def fit(self, x, distance=Jaccard): #x传入的是矩阵(行:物品,列:用户) self.sim = self.similarity(x, distance) #计算相似度 def recommend(self, a): #传入预测用户的购买记录的矩阵.T = n * 1 return np.dot(self.sim, a) * (1 - a)使用Lasso函数对与处理数据变量选择 灰色预测得到关键影响因素的预测值 使用神经网络对财政收入进行预测
一、神经网络 二、决策树 三、K-Means
API: add(); compile(); fit(); save_weights(); predict_classrs()
from keras.models import Sequential from keras.layers import Dense, Activation net = Sequential() net.add(Dense(input_dim=3, activation='relu', units=10)) net.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) net.fit(train[:, :3], train[:, 3], epochs=1000, batch_size=1)#传入的是矩阵,读取excel需要把数据.as_matrix() net.save_weights(netfile) predict_result = net.predict_classes(train[:, :3]).reshape(len(train))API: fit(); predict();
# 构建CART决策树模型 from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier() tree.fit(train[:, :3], train[:, 3]) plt = cm_plot(test[:, 3], tree.predict(test[:, :3]))#获取结果 plt.show()模型建立后,需要可视化分析数据挖掘的合理性,准确性等 混淆矩阵:正确与错误分类的情况 ROC曲线:分类方法的性能 聚类群图:使数据值聚成n类,分析n类群体特征
预测准确度:RMSE;MAE 分类准确度:precesion=TP/TP+FP :表示用户对推荐产品感兴趣的可能性 recall=TP/(TP+FN) :表示推荐的产品,占用户喜欢产品的概率
from sklearn.metrics import confusion_matrix # 导入混淆矩阵函数 cm = confusion_matrix(y, yp) # 混淆矩阵如下 # CM [[TP,FP],[FN,TN]] #例如['TP', 'FP', 'FN', 'TN'] == [46, 2, 7, 4] cm_train = confusion_matrix(train_label, smodel.predict(trainSet)) cm_test = confusion_matrix(test_label, smodel.predict(testSet)) pd.DataFrame(cm_train).to_excel(outFile1) pd.DataFrame(cm_test).to_excel(outFile2)