构建二元分类模型:
与线性回归模型不同的是,二元分类模型使用了二元交叉熵和激活函数,激活函数sigmoid使得结果介于0和1之间。 以下是代码片段:
import pandas as pd #导入pandas包
train_url = 'https://raw.githubusercontent.com/PacktWorkshops'\
'/The-TensorFlow-Workshop/master/Chapter05'\
'/dataset/dota2Train.csv' #创建变量包括训练集
X_train = pd.read_csv(train_url, header=None)
X_train.head() #读取_csv()方法,
提供csv文件的URL,并设置header=None因为数据集不提供列名。打印表格的前五行使用
head()方法的数据帧。
y_train = X_train.pop(0) #使用pop()方法提取目标变量(第0列),并将其保存在变量中
y_train = y_train.replace(-1,0)
y_train.head() #使用Replace()将目标变量中的所有-1替换为0,并使用head()方法打印前五行
test_url = 'https://raw.githubusercontent.com/PacktWorkshops'\
'/The-TensorFlow-Workshop/master/Chapter05/dataset'\
'/dota2Test.csv' #创建一个名为test_url的变量,该变量包含测试集的url
X_test = pd.read_csv(test_url, header=None)
X_test.head() #使用以下命令将测试数据集加载到名为X_test的DataFrame()函数中读取_csv()方法,提供csv文件的
URL,并设置header=None因为数据集不提供列名。使用打印机打印前五行head()方法
y_test = X_test.pop(0)
y_test = y_test.replace(-1,0)
y_test.head()
import tensorflow as tf
tf.random.set_seed(8) #使用tf将TensorFlow的种子设置为8。随机的设置_seed()以获取
可重复的结果
model = tf.keras.Sequential() #使用tf实例化一个序列模型。克拉斯。Sequential()并将其存储在
一个叫做model的变量
from tensorflow.keras.layers import Dense
fc1 = Dense(512, input_shape=(116,), activation='relu')
fc2 = Dense(512, activation='relu')
fc3 = Dense(128, activation='relu')
fc4 = Dense(128, activation='relu')
fc5 = Dense(1, activation='sigmoid')
model.add(fc1)
model.add(fc2)
model.add(fc3)
model.add(fc4)
model.add(fc5)
model.summary()
loss = tf.keras.losses.BinaryCrossentropy() #实例化损失函数
optimizer = tf.keras.optimizers.Adam(0.001) #实例化优化器
model.compile(optimizer=optimizer, loss=loss) #编译指定优化器
model.fit(X_train, y_train, epochs=5) #开始模型适配训练,训练次数为5轮
preds = model.predict(X_test)
preds[:5]
y_test[:5] #显示测试集的真实标签
计算accuracy(精确度):
from tensorflow.keras.metrics import Accuracy
preds = [1, 1, 1, 1, 0, 0]
target = [1, 0, 1, 0, 1, 0]
acc = Accuracy()
acc.update_state(preds, target)
acc.result().numpy()
使用Precision,Recall,F1Score预测模型准确度:
TP(true positive):代表预测和实际都为真
TN(true negative):代表预测和实际都为假
FP(False positive):代表预测为真,实际为假
FN(False negative):代表预测为假,实际为真
Precision=TP/(TP+FP)
Recall=TP/(TP+FN)
F1Score=2*(Precision*Recall/(Precision+Recall))
使用类计算准确度:
from tensorflow.keras.metrics import Precision, Recall
preds = [1, 1, 1, 1, 0, 0]
target = [1, 0, 1, 0, 1, 0]
prec = Precision()
prec.update_state(preds, target)
print(f"Precision: {prec.result().numpy()}")
rec = Recall()
rec.update_state(preds, target)
print(f"Recall: {rec.result().numpy()}")
使用混淆矩阵:
from tensorflow.math import confusion_matrix
preds = [1, 1, 1, 1, 0, 0]
target = [1, 0, 1, 0, 1, 0]
print(confusion_matrix(target, preds))
多类分类:
import pandas as pd #导入pandas包
train_url = 'https://raw.githubusercontent.com/PacktWorkshops'\
'/The-TensorFlow-Workshop/master/Chapter05'\
'/dataset/shuttle.trn' #导入训练集
X_train = pd.read_table(train_url, header=None, sep=' ')
X_train.head() #使用read_table()方法,提供CSV文件的URL,使用header=None因为数据集不提供列名,所以使用sep=''作为每个列的名称列在此数据集中由空格分隔。使用打印机打印前五行head()方法
y_train = X_train.pop(9) #使用pop()方法提取目标变量(第9列),并将其保存在变量y_train:
test_url = 'https://raw.githubusercontent.com/PacktWorkshops'\
'/The-TensorFlow-Workshop/master/Chapter05/dataset'\
'/shuttle.tst' #创建一个名为test_url的变量,该变量包含测试集的url
X_test = pd.read_table(test_url, header=None, sep=' ')
X_test.head() #使用read_table()将测试数据集加载到名为X_test的数据帧中,
提供CSV文件的URL,设置header=None,因为数据集没有提供列名,因为每一列都由一个此数据集中的空间,使用head()方法打印前五行
y_test = X_test.pop(9)
import tensorflow as tf
tf.random.set_seed(8)
model = tf.keras.Sequential()
from tensorflow.keras.layers import Dense
fc1 = Dense(512, input_shape=(9,), activation='relu')
fc2 = Dense(512, activation='relu')
fc3 = Dense(128, activation='relu')
fc4 = Dense(128, activation='relu')
fc5 = Dense(8, activation='softmax')
model.add(fc1)
model.add(fc2)
model.add(fc3)
model.add(fc4)
model.add(fc5)
model.summary()
loss = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam(0.001)
model.compile(optimizer=optimizer, loss=loss, \
metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5)
model.evaluate(X_test, y_test)