import pandas as pd
data = pd.read_csv('\\naconda_dir\\breast_cancer.csv',header = None)
data.iloc[:,-1].value_counts() #查看分类数据是否均匀
没有下载数据,可以从这里下载
链接:https://pan.baidu.com/s/1gnjqU5MPlorNrFkyppcPTw
提取码:c58o
注意:使用pandas提取数据的时候 header = None代表这个文件没有列索引,会自动生成默认数字的索引,如果想让第一行为列索引那就设置为 header=0,header=0 取第一行为列标签, 第一列作为行标签只需要在 加上 index _col=0
%matplotlib notebook
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
import warnings
warnings.filterwarnings("ignore")
#获取特征和标签值
x_data = data.iloc[:,:-1] #获取特征
y_data = data.iloc[:,-1] #获取标签
"""数据归一化(最大最小方法)"""
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(x_data) #训练
x_data = scaler.transform(x_data) #此时输出的x_data就是数组了
#pca降维
pca_model = PCA(n_components=10).fit(x_data) #代表提取的主成分有10个特征
x_pca_data = pca_model.transform(x_data)
x_pca_data
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu', input_shape=(10,)), #10维数据
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1,activation='sigmoid')
])
model.summary()
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['acc'])
# history = model.fit(x_pca_data, y_data, epochs=100, validation_split=0.1)
history = model.fit(x_pca_data, y_data, epochs=100)
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
注意!!!!!:
(1)如果是二分类的话,损失函数就使用binary_crossentropy
(2)如果是多分类的话,那么分成两种情况:一、分类标签是由单个数字代替的,那么损失函数使用categorical_crossrntropy。二、分类标签是由one_hot(热编码)编写的,损失函数是sparse_categorical_crossrntropy
(3)还有要注意的一点是,输出层的分类数据预测的激活函数应该是sigmoid,如果是回归函数预测应该是relu
%matplotlib notebook
import matplotlib.pyplot as plt
def plot_history(hist):
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.xlabel('Epoch')
plt.plot(hist['epoch'], hist['loss'],
label='loss')
plt.legend()
plt.subplot(1,2,2)
plt.xlabel('Epoch')
plt.plot(hist['epoch'], hist['acc'],
label = 'acc',color = 'red')
plt.legend()
plot_history(hist)
"""查看训练效果,从中随机提取20个数据下标"""
indices = np.random.choice(len(data), size=20)
# house_data.loc[indices,:]
count = 0
for n in indices:
count += 1
x_test = x_pca_data[n]
x_test = x_test.reshape(1,10)
predict = model.predict(x_test)
print("——第%d个数据——"% count)
predict = np.random.choice([0,1],size=1,p = [1-predict[0][0], predict[0][0]])
print("预测值:%f" % predict)
target = y_data[n]
print("标签值:%f" % target)
print('\n')
注意!!!!:这个predict是个二维数组所以np.random.choice([0,1],size=1,p = [1-predict[0][0], predict[0][0]])
才用predict[0][0]