数据特征处理——jupyter notebook为例

在训练机器学和深度学习模型时,都需要数据作为支持,数据可看作一个矩阵,行为数据个数,列为数据特征。

在有监督学习中,某一列特征为目标值,无监督学习则没有,下面介绍几种常见的数据处理方法

下面以简单的iris数据集为例:

数据集读取

from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris() #导入数据集
#iris = pd.read_csv("文件路径/文件名.csv") #数据集在本地使用pandas导入
#划分X,y

iris_features = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_label = pd.DataFrame(iris.target,columns = ["label"])
数据提取
data_1 = iris.iloc[0: ,0:4] #表示选取所有数据的前四列
data_2 = iris.iloc[0:100 , :]  #表示选取前100个数据
lables = iris["label"]  #将数据“Species”这一列取出
iris_features

在这里插入图片描述
在这里插入图片描述

数据合并
iris = pd.concat([iris_features,iris_label], axis=1) #axis=0要求列相同 ; axis=1要求行相同

在这里插入图片描述

编码

One-Hot编码

把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码。

pandas.get_dummies(data, prefix=None)

data: 数据集目标值columns名字

prefix:分组名字

iris_one_hot = pd.get_dummies(iris['label'], prefix="label")

在这里插入图片描述

标签编码

通过为每个类别分配一个唯一的整数值,将分类数据转换为数字,称为标签编码。

# from sklearn.compose import ColumnTransformer
# labelencoder = ColumnTransformer()
# iris.iloc[:, -1] = labelencoder.fit_transform(iris.iloc[:, -1])

分箱

当我们有一个数字特征,需要把它转换成分类特征,使用分箱,减少目标值类别,提高标签的信息承载度

#bins = [0, 1, 2, 3, 4, 5, 6, 7, 8]#自定义
bins = 10 #分成10组
iris_Sepal_Length= pd.cut(iris['Sepal_Length'], bins)

在这里插入图片描述

归一化与标准化

特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,
容易影响(支配)目标结果,使得一些算法无法学习到其它的特征

归一化

通过对原始数据进行变换把数据映射到(默认为[0,1])之间

最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景

from sklearn.preprocessing import MinMaxScaler

def minmax_demo():
    """
    归一化演示
    :return: None
    """
    data = iris
    print(data)
    # 1、实例化一个转换器类
    transfer = MinMaxScaler(feature_range=(0, 1))  #范围区间
    # 2、调用fit_transform
    data = transfer.fit_transform(data.iloc[:,0:-1])
    print("最小值最大值归一化处理的结果:\n", data)
    return None
minmax_demo()

在这里插入图片描述

标准化

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
在这里插入图片描述

方差越大,说明数据间差异越大

from sklearn.preprocessing import StandardScaler

def stand_demo():
    """
    标准化演示
    :return: None
    """
    data = iris
    print(data)
    # 1、实例化一个转换器类
    transfer = StandardScaler()
    # 2、调用fit_transform
    data = transfer.fit_transform(data.iloc[:,0:-1])
    print("标准化的结果:\n", data)
    print("每一列特征的平均值:\n", transfer.mean_)
    print("每一列特征的方差:\n", transfer.var_)

    return None
stand_demo()

在这里插入图片描述

处理缺失值

判断缺失值是否存在
import numpy as np
np.all(pd.notnull(iris))  #True则不存在缺失值
处理缺失值
# 把一些其它值标记的缺失值,替换成np.nan
iris = iris.replace(to_replace='?', value=np.nan)

# 删除
iris = iris.dropna()

# 替换填充平均值,中位数
iris['Sepal_Length'].fillna(iris['Sepal_Length'].mean(), inplace=True)

#替换所有缺失值
for i in iris.columns:
    if np.all(pd.notnull(iris[i])) == False:
        print(i)
        iris[i].fillna(iris[i].mean(), inplace=True)

数据集划分

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(iris_features, iris_label,test_size=0.2)

PAC降维

from sklearn.decomposition import PCA
transfer_1 = PCA(n_components=2)  #n_components为正整数表示特征值由4维降为2维,若为小于1的小数就代表准确率
iris_PCA = transfer_1.fit_transform(iris_features)

在这里插入图片描述

简单可视化

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.scatter(iris_PCA[:,0], iris_PCA[: ,1])
plt.show()

在这里插入图片描述


sns.lmplot(x = "Sepal_Length", y = "Petal_Length",data = iris ,hue = "label", fit_reg = False,markers=["o","x","s"], x_jitter = 0.2, y_jitter = 0.2, scatter_kws = {'alpha' : 1/3})

在这里插入图片描述

#各个特征之间关系分布图
pd.plotting.scatter_matrix(iris.iloc[:,0:-1], alpha = 0.8, figsize = (30,12), diagonal = 'kde')

在这里插入图片描述

例子

常用机器学习数据处理流程如下:

1.导入数据(编码,分箱,处理缺失值)

2.标准化(PCA降维)

3.划分数据集

4.sklearn模型训练

5.测试准确率

6.可视化

from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#1.read data
iris = load_iris()
iris_features = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_label = pd.DataFrame(iris.target,columns = ["label"])
iris = pd.concat([iris_features,iris_label], axis=1)


#2.standardization
from sklearn.preprocessing import StandardScaler
def stand_demo():
    """
    标准化演示
    :return: None
    """
    data = iris
    #print(data)
    # 1、实例化一个转换器类
    transfer = StandardScaler()
    # 2、调用fit_transform
    data = transfer.fit_transform(data.iloc[:,0:-1])
    #print("标准化的结果:\n", data)
    #print("每一列特征的平均值:\n", transfer.mean_)
    #print("每一列特征的方差:\n", transfer.var_)

    return data
iris_features = pd.DataFrame(stand_demo(),columns=["Sepal_Length","  Sepal_Width "," Petal_Length "," Petal_Width"])
iris = pd.concat([iris_features,iris_label], axis=1)

#3.PCA
from sklearn.decomposition import PCA
transfer_1 = PCA(n_components=2)  #n_components为正整数表示特征值由4维降为2维,若为小于1的小数就代表准确率
iris_PCA = transfer_1.fit_transform(iris_features)

#4.data split
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(iris_PCA , iris_label,test_size=0.2)

#5.ml
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
clf = RandomForestClassifier(n_estimators=200, random_state=0)
clf.fit(x_train, y_train)  # 使用训练集对分类器训练
y_predict = clf.predict(x_test)  # 使用分类器对测试集进行预测
print(clf.score(x_test , y_test))

# 6.performance index
from sklearn import metrics
import matplotlib.pyplot as plt
def Performance_metrics(y_test, y_predict):
    print('准确率:', metrics.accuracy_score(y_test, y_predict)) #预测准确率输出
    print('宏平均精确率:',metrics.precision_score(y_test,y_predict,average='macro')) #预测宏平均精确率输出
    print('微平均精确率:', metrics.precision_score(y_test, y_predict, average='micro')) #预测微平均精确率输出
    print('宏平均召回率:',metrics.recall_score(y_test,y_predict,average='macro'))#预测宏平均召回率输出
    print('平均F1-score:',metrics.f1_score(y_test,y_predict,average='weighted'))#预测平均f1-score输出
    print('混淆矩阵输出:\n',metrics.confusion_matrix(y_test,y_predict))#混淆矩阵输出
    print('分类报告:\n', metrics.classification_report(y_test, y_predict))#分类报告输出
    false_positive_rate, true_positive_rate, thresholds = metrics.roc_curve(y_test, y_predict, pos_label=2)
    roc_auc = metrics.auc(false_positive_rate, true_positive_rate)  #计算AUC值
    print('AUC=' + str(roc_auc))
    plt.title('Breast Cancer-ROC')
    plt.plot(false_positive_rate, true_positive_rate, 'b', label='AUC = %0.4f' % roc_auc)
    plt.legend(loc='lower right')
    plt.plot([0, 1], [0, 1], 'r--')
    plt.ylabel('TPR')
    plt.xlabel('FPR')
    # plt.savefig('figures/PC5.png') #将ROC图片进行保存
    plt.show()
Performance_metrics(y_test, y_predict)


在这里插入图片描述

# 7 visualization
iris = pd.concat([pd.DataFrame(iris_PCA,columns=['f1','f2']),iris_label],axis=1)
sns.lmplot(x = "f1", y = "f2",data = iris ,hue = "label", fit_reg = False,markers=["o","x","s"], x_jitter = 0.2, y_jitter = 0.2, scatter_kws = {'alpha' : 1/3})

在这里插入图片描述

  • 19
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是在jupyter notebook上使用RFM模型分析客户价值的完整流程,并绘制相应的图像。 1. 数据准备 首先,我们需要准备一份客户交易数据。在本次演示中,我们使用一个示例数据集,包含了客户ID、交易日期、交易金额等信息。您可以在以下链接下载示例数据集:https://cdn.jsdelivr.net/gh/datagy/mediumdata/rfm_data.csv。 2. 数据处理 接下来,我们需要对数据进行预处理,包括删除重复数据处理缺失值等。代码如下: ```python # 导入所需库 import pandas as pd # 读取数据 data = pd.read_csv('rfm_data.csv') # 删除重复数据 data.drop_duplicates(inplace=True) # 处理缺失值 data.dropna(inplace=True) ``` 3. 计算RFM指标 计算RFM指标是RFM模型的核心步骤,我们需要根据客户的交易行为,计算出每个客户的R、F、M指标。代码如下: ```python # 计算R指标 import datetime as dt last_date = data['InvoiceDate'].max() + dt.timedelta(days=1) data['Diff'] = last_date - data['InvoiceDate'] data['R'] = data['Diff'].apply(lambda x: x.days) # 计算F指标 data['F'] = data.groupby(['CustomerID'])['InvoiceNo'].transform('nunique') # 计算M指标 data['M'] = data.groupby(['CustomerID'])['TotalPrice'].transform('sum') # 删除不需要的列 data.drop(['InvoiceNo', 'StockCode', 'Description', 'Quantity', 'InvoiceDate', 'UnitPrice', 'Diff', 'TotalPrice'], axis=1, inplace=True) ``` 4. RFM分值计算 根据客户在R、F、M指标上的表现,我们可以为每个指标分配不同的分值,从而计算出客户的RFM分值。代码如下: ```python # 定义分值范围和分值 r_labels = range(4, 0, -1) r_groups = pd.qcut(data['R'], q=4, labels=r_labels) f_labels = range(1, 5) f_groups = pd.qcut(data['F'], q=4, labels=f_labels) m_labels = range(1, 5) m_groups = pd.qcut(data['M'], q=4, labels=m_labels) # 将分值合并到一起 data['R_Score'] = r_groups.astype('int') data['F_Score'] = f_groups.astype('int') data['M_Score'] = m_groups.astype('int') # 计算RFM总分值 data['RFM_Score'] = data['R_Score'] * 100 + data['F_Score'] * 10 + data['M_Score'] ``` 5. RFM分群 根据RFM模型的原理,我们将客户根据RFM总分值进行分群,通常将客户分为3-5个等级。代码如下: ```python # 定义分群函数 def rfm_group(score): if score >= 311 and score <= 444: return '重要价值客户' elif score >= 211 and score <= 310: return '重要保持客户' elif score >= 111 and score <= 210: return '重要挽留客户' elif score >= 11 and score <= 110: return '低价值客户' else: return '流失客户' # 计算客户RFM分群 data['RFM_Group'] = data['RFM_Score'].apply(rfm_group) ``` 6. 绘制RFM散点图 最后,我们可以通过绘制RFM散点图,更直观地展示客户在R、F、M三个指标上的表现,并且可以根据不同的RFM分群,对客户进行可视化分析。代码如下: ```python # 导入所需库 import matplotlib.pyplot as plt import seaborn as sns # 绘制RFM散点图 sns.set_style('white') plt.figure(figsize=(12,10)) plt.scatter(data['R'], data['F'], c=data['M_Score'], cmap='viridis') plt.xlabel('Recency (days)') plt.ylabel('Frequency (times)') plt.title('RFM Analysis') plt.show() # 绘制RFM分群柱状图 plt.figure(figsize=(10,6)) data['RFM_Group'].value_counts().plot(kind='bar') plt.xlabel('RFM Group') plt.ylabel('Count') plt.title('RFM Group Analysis') plt.show() ``` 以上就是在jupyter notebook上使用RFM模型分析客户价值,并绘制相应图像的完整流程。希望可以对您有所帮助!
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值