刘金鹏做网站,mip网站建设公司,WordPress按评论时间排序,app 快速开发平台模型预测 一、导入关键包二、如何载入、分析和保存文件三、修改缺失值3.1 众数3.2 平均值3.3 中位数3.4 0填充 四、修改异常值4.1 删除4.2 替换 五、数据绘图分析5.1 饼状图5.1.1 绘制某一特征的数值情况#xff08;二分类#xff09; 5.2 柱状图5.2.1 单特征与目标特征之间的… 模型预测 一、导入关键包二、如何载入、分析和保存文件三、修改缺失值3.1 众数3.2 平均值3.3 中位数3.4 0填充 四、修改异常值4.1 删除4.2 替换 五、数据绘图分析5.1 饼状图5.1.1 绘制某一特征的数值情况二分类 5.2 柱状图5.2.1 单特征与目标特征之间的图像5.2.2 多特征与目标特征之间的图像 5.3 折线图5.3.1 多个特征之间的关系图 5.4 散点图 六、特征选择6.1、相关性分析6.1.1 皮尔逊相关系数6.1.2 斯皮尔曼相关系数6.1.3 肯德尔相关系数6.1.4 计算热力图 6.2 主成分分析6.3 线性判别分析 七、数据归一化八、模型搭建九、模型训练十、评估模型十一、预测模型 一、导入关键包
# 导入数据分析需要的包
import pandas as pd
import numpy as np
# 可视化包
import seaborn as sns
sns.set(stylewhitegrid)
import matplotlib.pyplot as plt
%matplotlib inline
# 忽略警告信息
import warnings
warnings.filterwarnings(ignore)
# 导入数据分析需要的包
import pandas as pd
import numpy as np
from datetime import datetime# 构建多个分类器
from sklearn.ensemble import RandomForestClassifier # 随机森林
from sklearn.svm import SVC, LinearSVC # 支持向量机
from sklearn.linear_model import LogisticRegression # 逻辑回归
from sklearn.neighbors import KNeighborsClassifier # KNN算法
from sklearn.naive_bayes import GaussianNB # 朴素贝叶斯
from sklearn.tree import DecisionTreeClassifier # 决策树分类器
from xgboost import XGBClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import GridSearchCV # 网格搜索
np.set_printoptions(suppressTrue)# 显示中文
plt.rcParams[font.sans-serif] [SimHei]
plt.rcParams[axes.unicode_minus] False二、如何载入、分析和保存文件
dfpd.read_csv(data/dataset.csv)df.head(5)# 查看前几列数据
df.tail() # 返回CSV文件的最后几行数据。
df.info() # 显示CSV文件的基本信息包括数据类型、列数、行数、缺失值等。
df.describe()# 对CSV文件的数值型数据进行统计描述包括计数、均值、标准差、最小值、最大值等。
df.shape()# 返回CSV文件的行数和列数。
df[IS_WX].unique() # 返回CSV文件中某一列的唯一值。
df.value_counts()# 计算CSV文件中某一列中每个值的出现次数。
df.groupby(col1)[col2] # 按照某一列的值进行分组并对其他列进行聚合操作如求和、计数、平均值等。
df.sort_values(bycol1) # 按照某一列的值进行排序。
df.pivot_table(valuesC, indexA, columnsB, aggfuncmean)# 创建透视表根据指定的行和列对数据进行汇总和分析。# 保存处理后的数据集
df.to_csv(data/Telecom_data_flag.csv)三、修改缺失值
3.1 众数
# 对每一列属性采用相应的缺失值处理方式,通过分析发现这类数据都可以采用众数的方式解决
df.isnull().sum()
modes df.mode().iloc[0]
print(modes)
df df.fillna(modes)
print(df.isnull().sum())3.2 平均值
mean_values df.mean()
print(mean_values)
df df.fillna(mean_values)
print(df.isnull().sum())3.3 中位数
median_values df.median()
print(median_values)
df df.fillna(median_values)
print(df.isnull().sum())3.4 0填充
df df.fillna(0)
print(df.isnull().sum())四、修改异常值
4.1 删除
1.删除DataFrame表中全部为NaN的行 your_dataframe.dropna(axis0,howall) 2.删除DataFrame表中全部为NaN的列 your_dataframe.dropna(axis1,howall) 3.删除表中含有任何NaN的行 your_dataframe.dropna(axis0,howany) 4.删除表中含有任何NaN的列 your_dataframe.dropna(axis1,howany)4.2 替换
这里的替换可以参考前文的中位数平均值众数0替换等。 replace_value 0.0# 这里设置 inplace 为 True能够直接把表中的 NaN 值替换掉your_dataframe.fillna(replace_value, inplaceTrue)# 如果不设置 inplace则这样写就行# new_dataframe your_dataframe.fillna(replace_value)
五、数据绘图分析
5.1 饼状图
5.1.1 绘制某一特征的数值情况二分类
# 查看总体客户流失情况
churnvalue df[LEAVE_FLAG].value_counts()
labels df[LEAVE_FLAG].value_counts().index
plt.pie(churnvalue,labels[未流失,流失],explode(0.1,0),autopct%.2f%%, shadowTrue,)
plt.title(客户流失率比例,size24)
plt.show()
# 从饼形图中看出流失客户占总客户数的很小的比例流失率达3.58%5.2 柱状图
5.2.1 单特征与目标特征之间的图像
# 粘性/忠诚度分析 包括绑定银行卡张数
fig, axes plt.subplots(1, 1, figsize(12,12))
plt.subplot(1,1,1)
# palette参数表示设置颜色
gendersns.countplot(xBANK_NUM,hueLEAVE_FLAG,datadf,palettePastel2)
plt.xlabel(绑定银行卡张数,fontsize16)
plt.title(LEAVE_FLAG by BANK_NUM,fontsize18)
plt.ylabel(count,fontsize16)
plt.tick_params(labelsize12) # 设置坐标轴字体大小
# 从此表可知对于没有绑定银行卡的用户流失情况会更大应该加强督促用户绑定银行卡# 查看正常用户与流失用户在上网流量上的差别
plt.figure(figsize(10,6))
g sns.FacetGrid(data df,hue LEAVE_FLAG, height4, aspect3)
g.map(sns.distplot,BYTE_ALL,norm_histTrue)
g.add_legend()
plt.ylabel(density,fontsize16)
plt.xlabel(BYTE_ALL,fontsize16)
plt.xlim(0, 100)
plt.tick_params(labelsize13) # 设置坐标轴字体大小
plt.tight_layout()
plt.show()
# 从上图看出上网流量少的用户流失率相对较高。5.2.2 多特征与目标特征之间的图像
这里绘制的多个二分类特征的情况是与目标特征之间的关系
# 粘性/忠诚度分析 包括是否捆绑微信、是否捆绑支付宝
# sns.countplot()函数绘制了是否使用支付宝IS_ZFB这一列的柱状图并根据LEAVE_FLAG是否离网进行了颜色分类。
fig, axes plt.subplots(1, 2, figsize(12,12))
plt.subplot(1,2,1)
# palette参数表示设置颜色
partnersns.countplot(xIS_ZFB,hueLEAVE_FLAG,datadf,palettePastel2)
plt.xlabel(是否使用支付宝1代表使用0代表使用)
plt.title(LEAVE_FLAG by IS_ZFB,fontsize18)
plt.ylabel(count,fontsize16)
plt.tick_params(labelsize12) # 设置坐标轴字体大小plt.subplot(1,2,2)
seniorcitizensns.countplot(xIS_WX,hueLEAVE_FLAG,datadf,palettePastel2)
plt.xlabel(是否使用微信1代表使用0代表使用)
plt.title(LEAVE_FLAG by IS_WX,fontsize18)
plt.ylabel(count,fontsize16)
plt.tick_params(labelsize12) # 设置坐标轴字体大小
# 从此表可知 支付宝绑定目前对于用户流失没有影响微信的绑定影响会稍微大点可能是微信用户用的较多# 异常性 根据用户流失情况来结合判定
covariables[CMPLNT_NUM, STOP_COUNT]
fig,axesplt.subplots(1,2,figsize(20,12))
for i, item in enumerate(covariables):0,CMPLNT_NUM1,STOP_COUNTplt.subplot(1,2,(i1))axsns.countplot(xitem,hueLEAVE_FLAG,datadf,paletteSet2)plt.xlabel(str(item),fontsize16)plt.tick_params(labelsize14) # 设置坐标轴字体大小plt.title(LEAVE_FLAG by str(item),fontsize20)ii1
plt.tight_layout()
plt.show()
# 从此表可知 最近6个月累计投诉次数间接性的决定了用户的流失停机天数也和用户流失成正相关。5.3 折线图
5.3.1 多个特征之间的关系图
# 用户的成长性分析结合用户流失情况。
# 包括流量趋势、语音通话次数趋势、语音通话时长趋势、交往圈趋势
# 提取特征数据列
feature1 df[LIULIANG_B]
feature2 df[YUYING_COUNT]
feature3 df[YUYING_B]
feature4 df[JIAOWANG_B]# 绘制折线图
plt.plot(feature1, labelLIULIANG_B)
plt.plot(feature2, labelYUYING_COUNT)
plt.plot(feature3, labelYUYING_B)
plt.plot(feature4, labelJIAOWANG_B)# 添加标题和标签
plt.title(Trend of User growth)
plt.xlabel(Index)
plt.ylabel(Value)# 添加图例
plt.legend()# 显示图表
plt.show()
# 从此图可以发现针对流量趋势来说用户的波动是最大的。5.4 散点图
df.plot(xSERV_ID_COUNT, yCDR_NUM, kindscatter, cred)
plt.show()这段代码的作用是绘制一个以SERV_ID_COUNT为横轴CDR_NUM为纵轴的散点图并将散点的颜色设置为红色。通过这个散点图可以直观地观察到SERV_ID_COUNT和CDR_NUM之间的关系。
六、特征选择
6.1、相关性分析
6.1.1 皮尔逊相关系数
plt.figure(figsize(16,8))
df.corr()[LEAVE_FLAG].sort_values(ascending False).plot(kindbar)
plt.tick_params(labelsize14) # 设置坐标轴字体大小
plt.xticks(rotation45) # 设置x轴文字转向
plt.title(Correlations between LEAVE_FLAG and variables,fontsize20)
plt.show()
# 从图可以直观看出YUYING_COUNT 、YUYING_B、IS_ZFB、BALANCE、JIAOWANG_B、IS_WX这六个变量与LEAVE_FLAG目标变量相关性最弱。6.1.2 斯皮尔曼相关系数
plt.figure(figsize(16,8))
df.corr(methodspearman)[LEAVE_FLAG].sort_values(ascending False).plot(kindbar)
plt.tick_params(labelsize14) # 设置坐标轴字体大小
plt.xticks(rotation45) # 设置x轴文字转向
plt.title(Correlations between LEAVE_FLAG and variables,fontsize20)
plt.show()6.1.3 肯德尔相关系数
plt.figure(figsize(16,8))
df.corr(methodkendall)[LEAVE_FLAG].sort_values(ascending False).plot(kindbar)
plt.tick_params(labelsize14) # 设置坐标轴字体大小
plt.xticks(rotation45) # 设置x轴文字转向
plt.title(Correlations between LEAVE_FLAG and variables,fontsize20)
plt.show()6.1.4 计算热力图
# 计算相关性矩阵
corr_matrix df.corr()# 绘制热力图
plt.figure(figsize(10, 8))
sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm)
plt.title(Correlation Heatmap, fontsize16)
plt.show()6.2 主成分分析
PCA思想构造原变量的一系列线性组合形成几个综合指标以去除数据的相关性并使低维数据最大程度保持原始高维数据的方差信息
一般来说在进行数据降维之前需要先对其做归一化
from sklearn import preprocessing
X_scaled preprocessing. scale(X)
pca PCA(n_components2) # 加载PCA算法设置降维后主成分数目为2
# n_components的值不能大于n_features特征数和n_classes类别数之间的较小值减1。
reduced_x pca.fit_transform(X_scaled) # 对样本进行降维
reduced_x pd.DataFrame(reduced_x, columns [pca_1,pca_2])PCA代码
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.decomposition import PCA # 加载PCA算法包
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import svm
import pandas as pddf pd.read_csv(rD:\Python\test\iris.csv)
X df.iloc[:, 0:4]
Y df.iloc[:, 4]
x_train, x_test, y_train, y_test train_test_split(X, Y, test_size0.2)
pca PCA(n_components2) # 加载PCA算法设置降维后主成分数目为2
# n_components的值不能大于n_features特征数和n_classes类别数之间的较小值减1。
reduced_x pca.fit_transform(X) # 对样本进行降维
reduced_x pd.DataFrame(reduced_x, columns [pca_1,pca_2])
print(reduced_x.head(5))# SVM分类
x_train, x_test, y_train, y_test train_test_split(reduced_x, Y, test_size0.2)
clf svm.SVC(gammascale, decision_function_shapeovr) # 一对多法
# clf svm.SVC(gammascale, decision_function_shapeovo) # 一对一法
clf.fit(x_train, y_train.astype(int))
y_pred clf.predict(x_test)# 可视化,画分类结果图
N, M 500, 500 # 横纵各采样多少个值
x1_min, x2_min x_train.min(axis0)
x1_max, x2_max x_train.max(axis0)
t1 np.linspace(x1_min, x1_max, N)
t2 np.linspace(x2_min, x2_max, M)
x1, x2 np.meshgrid(t1, t2) # 生成网格采样点
x_show np.stack((x1.flat, x2.flat), axis1) # 测试点
y_predict clf.predict(x_show)
cm_light mpl.colors.ListedColormap([#A0FFA0, #FFA0A0, #A0A0FF])
cm_dark mpl.colors.ListedColormap([g, r, b])
plt.pcolormesh(x1, x2, y_predict.reshape(x1.shape), cmapcm_light)
plt.scatter(x_train.iloc[:, 0], x_train.iloc[:, 1], cy_train, cmapcm_dark, markero, edgecolorsk)
plt.grid(True, ls:)
plt.show()PCA结果
6.3 线性判别分析
LDA思想最早提出是为了解决生物问题的分类问题有监督的线性降维。使用数据的类别信息将高维的样本线性投影到低维空间中使得数据样本在低维空间中数据的类别区分度最大。
LDA代码
# 1.导入所需的库和模块
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import load_iris# 2.加载数据集
iris load_iris()
X iris.data
y iris.target# 3.创建一个LDA对象并拟合数据
# 在这里n_components参数指定要保留的主成分数量。
lda LinearDiscriminantAnalysis(n_components2)
X_lda lda.fit_transform(X, y)# 4.可以使用以下代码可视化结果
plt.scatter(X_lda[:, 0], X_lda[:, 1], cy)
plt.xlabel(LD1)
plt.ylabel(LD2)
plt.show()
LDA结果
七、数据归一化
特征主要分为连续特征和离散特征其中离散特征根据特征之间是否有大小关系又细分为两类。
连续特征一般采用归一标准化方式处理。离散特征特征之间没有大小关系。离散特征特征之间有大小关联则采用数值映射。
# 通过归一化处理使特征数据标准为1均值为0符合标准的正态分布
# 降低数值特征过大对预测结果的影响
# 除了目标特征全部做归一化目标特征不用做归一化会导致预测结果的解释变得困难
from sklearn.preprocessing import StandardScaler
# 实例化一个转换器类
scaler StandardScaler(copyFalse)
target df[LEAVE_FLAG]
# 提取除目标特征外的其他特征
other_features df.drop(LEAVE_FLAG, axis1)
# 对其他特征进行归一化
normalized_features scaler.fit_transform(other_features)
# 将归一化后的特征和目标特征重新组合成DataFrame
normalized_data pd.DataFrame(normalized_features, columnsother_features.columns)
normalized_data[LEAVE_FLAG] target
normalized_data.head()八、模型搭建
# 深拷贝
Xnormalized_data.copy()
X.drop([LEAVE_FLAG],axis1, inplaceTrue)
ydf[LEAVE_FLAG]
#查看预处理后的数据
X.head()# 建立训练数据集和测试数据集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test train_test_split(X,y,test_size 0.3, random_state 0)
print(原始训练集包含样本数量: , len(X_train))
print(原始测试集包含样本数量: , len(X_test))
print(原始样本总数: , len(X_train)len(X_test))# 使用分类算法
Classifiers[[RandomForest,RandomForestClassifier()],[LogisticRegression,LogisticRegression(C1000.0, random_state30, solverlbfgs,max_iter100000)],[NaiveBayes,GaussianNB()],[DecisionTree,DecisionTreeClassifier()],[AdaBoostClassifier, AdaBoostClassifier()],[GradientBoostingClassifier, GradientBoostingClassifier()],[XGB, XGBClassifier()]
]九、模型训练
from datetime import datetime
import pickle
import joblibdef get_current_time():current_time datetime.now()formatted_time current_time.strftime(%Y-%m-%d %H:%M:%S)return current_time, formatted_timeClassify_result[]
names[]
prediction[]
i 0for name, classifier in Classifiers:start_time, formatted_time get_current_time()print(**********************************************************************)print(第{}个模型训练开始时间{} 模型名称为{}.format(i1, formatted_time, name))classifier classifierclassifier.fit(X_train, y_train)y_pred classifier.predict(X_test)recall recall_score(y_test, y_pred)precision precision_score(y_test, y_pred)f1score f1_score(y_test, y_pred)model_path models/{}_{}_model.pkl.format(name, round(precision, 5))print(开始保存模型文件路径为{}.format(model_path))# 保存模型方式1# with open(models/{}_{}_model.pkl.format(name, precision), wb) as file:# pickle.dump(classifier, file)# file.close()# 保存模型方式2joblib.dump(classifier, model_path)end_time datetime.now() # 获取训练结束时间print(第{}个模型训练结束时间:{}.format(i1, end_time.strftime(%Y-%m-%d %H:%M:%S)))print(训练耗时:, end_time - start_time)# 打印训练过程中的指标print(Classifier:, name)print(Recall:, recall)print(Precision:, precision)print(F1 Score:, f1score)print(**********************************************************************)# 保存指标结果class_eva pd.DataFrame([recall, precision, f1score])Classify_result.append(class_eva)name pd.Series(name)names.append(name)y_pred pd.Series(y_pred)prediction.append(y_pred)i 1十、评估模型
召回率recall的含义是原本为对的当中预测为对的比例值越大越好1为理想状态
精确率、精度precision的含义是预测为对的当中原本为对的比例值越大越好1为理想状态
F1分数F1-Score指标综合了Precision与Recall的产出的结果
F1-Score的取值范围从0到1的1代表模型的输出最好0代表模型的输出结果最差。
classifier_namespd.DataFrame(names)
# 转成列表
classifier_namesclassifier_names[0].tolist()
resultpd.concat(Classify_result,axis1)
result.columnsclassifier_names
result.index[recall,precision,f1score]
result十一、预测模型
对于h5模型
from keras.models import load_model
model load_model(lstm_model.h5)
pred model.predict(X, verbose0)
print(pred)对于pkl模型
loaded_model joblib.load(models/{}_model.pkl.format(name))由于没有预测数据集选择最后n条数为例进行预测。
# 由于没有预测数据集选择最后n条数为例进行预测。
n 500
pred_id SERV_ID.tail(n)
# 提取预测数据集特征如果有预测数据集可以一并进行数据清洗和特征提取
pred_x X.tail(n)# 使用上述得到的最优模型
model GradientBoostingClassifier()model.fit(X_train,y_train)
pred_y model.predict(pred_x) # 预测值# 预测结果
predDf pd.DataFrame({SERV_ID:pred_id, LEAVE_FLAG:pred_y})
print(*********************原始的标签情况*********************)
print(df.tail(n)[LEAVE_FLAG].value_counts())
print(*********************预测的标签情况*********************)
print(predDf[LEAVE_FLAG].value_counts())
print(*********************预测的准确率*********************)
min1 min(df.tail(n)[LEAVE_FLAG].value_counts()[0],predDf[LEAVE_FLAG].value_counts()[0])
min2 min(df.tail(n)[LEAVE_FLAG].value_counts()[1],predDf[LEAVE_FLAG].value_counts()[1])
print({}%.format(round((min1min2)/n,3)*100))# 由于没有预测数据集选择最后n条数为例进行预测。
n 500 # 预测的数量
pred_id SERV_ID.tail(n)
# 提取预测数据集特征如果有预测数据集可以一并进行数据清洗和特征提取
pred_x X.tail(n)
# 加载模型
loaded_model joblib.load(models/GradientBoostingClassifier_0.77852_model.pkl)
# 使用加载的模型进行预测
pred_y loaded_model.predict(pred_x)
# 预测结果
predDf pd.DataFrame({SERV_ID:pred_id, LEAVE_FLAG:pred_y})
print(*********************原始的标签情况*********************)
print(df.tail(n)[LEAVE_FLAG].value_counts())
print(*********************预测的标签情况*********************)
print(predDf[LEAVE_FLAG].value_counts())
print(*********************预测的准确率*********************)
min1 min(df.tail(n)[LEAVE_FLAG].value_counts()[0],predDf[LEAVE_FLAG].value_counts()[0])
min2 min(df.tail(n)[LEAVE_FLAG].value_counts()[1],predDf[LEAVE_FLAG].value_counts()[1])
print({}%.format(round((min1min2)/n,3)*100))