Facebook营销组合分类

 一、初始化

import numpy as np
import pandas as pd
import tensorflow as tf
# sklearn.preprocessing.LabelEncoder():标准化标签,将标签值统一转换成range(标签值个数-1)范围内
from sklearn.preprocessing import LabelEncoder
# one hot 编码
from sklearn.preprocessing import OneHotEncoder
# train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。
from sklearn.model_selection import train_test_split

二、对数据集进行处理

def load_data(path):"""加载数据集,并对数据集进行处理。Parameters-----path : str数据集的路径。Returns-----(X, y) : tuple特征矩阵X与对应的标签y。"""# 加载数据集,注意数据集中没有标题行,需要将header的值设置为None。data = pd.read_csv(path, header=None)# 将加载的数据集分为特征X与标签y。iloc函数:通过行号来取行数据(如取第二行的数据)X, y = data.iloc[:, :-1], data.iloc[:, -1]# 对特征矩阵X进行编码。
'''
LabelEncoder是用来对分类型特征值进行编码,即对不连续的数值或文本进行编码。
fit(): Method calculates the parameters μ and σ and saves them as internal objects.
解释:简单来说,就是求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。transform(): Method using these calculated parameters apply the transformation to a particular dataset.
解释:在fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。fit_transform(): joins the fit() and transform() method for transformation of dataset.
解释:fit_transform是fit和transform的组合,既包括了训练又包含了转换。
transform()和fit_transform()二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等)fit_transform(trainData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。假如有三种颜色特征:红、黄、蓝。 在利用机器学习的算法时一般需要进行向量化或者数字化。
那么你可能想令 红=1,黄=2,蓝=3. 那么这样其实实现了标签编码,即给不同类别以标签。
然而这意味着机器可能会学习到“红<黄<蓝”,但这并不是我们的让机器学习的本意,只是想让机器区分它们,并无大小比较之意。所以这时标签编码是不够的,需要进一步转换。
因为有三种颜色状态,所以就有3个比特。
即红色:1 0 0 ,黄色: 0 1 0,蓝色:0 0 1 。
如此一来每两个向量之间的距离都是根号2,在向量空间距离都相等,所以这样不会出现偏序性,基本不会影响基于向量空间度量算法的效果。'''lb = LabelEncoder()X = X.apply(lambda col: lb.fit_transform(col))# 进行one-hot编码ohe = OneHotEncoder()X = pd.DataFrame(ohe.fit_transform(X).toarray())# tensorflow不支持数值列,需要转换。'''
f-Strings格式化字符串文字
name = "Eric"
age = 74
f"Hello, {name}. You are {age}."
map() 是一个Series的函数,DataFrame结构中没有map()。map()将一个自定义函数应用于Series结构中的每个元素(elements)。
apply()将一个函数作用于DataFrame中的每个行或者列。'''X.columns = X.columns.map(lambda x: f"c{x}")return X, ydef train_input_fn(features, labels):"""定义训练函数,用于训练使用。Parameters-----features : 类数组类型。 形状:[样本数量, 特征数量]用于训练的特征矩阵。labels : 类数组类型。形状为:[样本数量]每个样本对应的标签。(分类)Returns-----dataset : tf.data.Dataset数据集。"""'''
tf.data.Dataset.from_tensor_slices(array)获取分片数据,将输入的array按照第0维度分片
在图像识别中可能出现的字典或者元组的矩阵情况,因为将图像数字化之后,会产生矩阵和对应的标签。比如:
{”image”:image_tensor,”label”:label_tensor}的形式。
函数会分别切分”a”中的数值以及”b”中的数值,最后总dataset中的一个元素就是类似于{ “a”:1.0, “b”:[0.9,0.1] }的形式。
'''# 创建数据集dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))# 对数据集进行洗牌,重复与分批处理。
'''
shuffle(10000, seed=0),对前10000个数据进行打乱,设置随机种子以便结果重现。
repeat(10),数据集如果训练完了,还没有结束,让训练集重头再开始训练。
batch(50),批处理,一次传递50个样本进行训练。
'''dataset = dataset.shuffle(10000, seed=0).repeat(10).batch(50)return datasetdef eval_input_fn(features, labels=None):"""定义评估函数,用于评估或预测。Parameters-----features : 类数组类型。 形状:[样本数量, 特征数量]用于测试的特征矩阵。labels : 类数组类型。形状为:[样本数量]每个样本对应的标签。(分类)Returns-----dataset : tf.data.Dataset数据集。"""# 将特征转换成字典类型features = dict(features)# 如果要进行未知数据的预测,则没有标签。if labels is None:inputs = featureselse:inputs = (features, labels)# 创建数据集dataset = tf.data.Dataset.from_tensor_slices(inputs)# 每次取出100条记录dataset = dataset.batch(100)return dataset
'''
train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。格式:X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)参数解释:train_data:被划分的样本特征集train_target:被划分的样本标签test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量random_state:是随机数的种子。随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。
'''X, y = load_data(r"data.csv")
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.25, random_state=0)# 定义特征列列表
my_feature_columns = []'''
为了让深度神经网络可以接收并处理各种各样的原始数据,就需要对使用tf.feature_column这个模块来创建模型可使用的各种feature columns。
tf.feature_column.numeric_column主要处理的是原始数据是实数(默认为tf.float32),这样的特征值模型可以直接使用,并不需要做其他任何转换。
numeric_column(key,shape=(1,),default_value=None,dtype=tf.float32,normalizer_fn=None
)
key: 特征的名字。也就是对应的列名称。
shape: 该key所对应的特征的shape. 默认是1,但是比如one-hot类型的,shape就不是1,而是实际的维度。总之,这里是key所对应的维度,不一定是1.
default_value: 如果不存在使用的默认值
normalizer_fn: 对该特征下的所有数据进行转换。如果需要进行normalize,那么就是使用normalize的函数.这里不仅仅局限于normalize,也可以是任何的转换方法,比如取对数,取指数,这仅仅是一种变换方法.
'''for key in train_X.keys():# 创建tensorflow特征列,并加入到特征列表当中。my_feature_columns.append(tf.feature_column.numeric_column(key=key))
'''
调用DNNClassifier分类器
基本格式:
feature_columns作为特征列,但是这里不添加数据,仅仅是使用tf.feature_column添加数据特征;数据特征相当于一个字典的键值,这个键值是真正训练时输入数据的特征列的名称。
hidden_units=[10, 10]表示隐含层是10*10的神经网络
n_classes=3表示输出层的分类有3个
optimizer表示使用的训练函数
tf.estimator.DNNClassifier(feature_columns=my_feature_columns,hidden_units=[10, 10],n_classes=3,optimizer=tf.train.AdamOptimizer(learning_rate=0.01))
对于我们的问题,有512个神经元,2层;10分类的问题;SGD为随机梯度下降。
'''
classifier = tf.estimator.DNNClassifier(feature_columns=my_feature_columns, hidden_units=[512] * 2, n_classes=10, optimizer="SGD")
'''
(3)train(训练)
train(input_fn,hooks=None,steps=None,max_steps=None,saving_listeners=None
)用于训练模型,以下为参数列表:input_fn:
一个用来构造用于评估的数据的函数,这个函数应该构造和返回如下的值:一个tf.data.Dataset对象或者一个包含 (features, labels)的元组,它们应当满足model_fn函数对输入数据的要求,在后面的实例中我们会详细介绍。hooks:
tf.train.SessionRunHook的子类实例列表,在预测调用中用于传回。steps:
模型训练的次数,如果不指定,则会一直训练知道input_fn传回的数据消耗完为止。如果你不想要增量表现,就设置max_steps来替代,注意设置了steps,max_steps必须为None,设置了max_steps,steps必须为None。max_steps:
模型训练的总次数,注意设置了steps,max_steps必须为None,设置了max_steps,steps必须为None。saving_listeners:
CheckpointSaverListener对象的列表,用于在检查点保存之前或之后立即运行的回调。'''
classifier.train(input_fn=lambda : train_input_fn(train_X, train_y))
'''
evaluate(评估)
evaluate(input_fn,steps=None,hooks=None,checkpoint_path=None,name=None
)评估函数,使用input_fn给出的评估数据评估训练好的模型,参数列表如下:input_fn:
一个用来构造用于评估的数据的函数,这个函数应该构造和返回如下的值:一个tf.data.Dataset对象或者一个包含 (features, labels)的元组,它们应当满足model_fn函数对输入数据的要求,在后面的实例中我们会详细介绍。
checkpoint_path:
用来保存训练好的模型
name:
如果用户需要在不同的数据集上运行多个评价,如训练集和测试集,则为要进行评估的名称,不同的评估度量被保存在单独的文件夹中,并分别出现在tensorboard中。
'''classifier.evaluate(input_fn=lambda : eval_input_fn(test_X, test_y))

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部