预备知识
pandas
中的iloc
方法
在对csv
文件进行读取的时候,使用iloc
方法比较方便,如:对这么一个数据进行读取:
0,30.83,0,0,0,9,0,1.25,0,0,1,1,0,202,0,-1
1,58.67,4.46,0,0,8,1,3.04,0,0,6,1,0,43,560,-1
1,24.5,0.5,0,0,8,1,1.5,0,1,0,1,0,280,824,-1
0,27.83,1.54,0,0,9,0,3.75,0,0,5,0,0,100,3,-1
0,20.17,5.625,0,0,9,0,1.71,0,1,0,1,2,120,0,-1
...
只需要,这样:
import pandas as pd
datas = pd.read_csv("credit-a.csv", header=None) # 注意到没有表头
此时,可以结合iloc
来进行对类别的统计,即最后一列:
datas.iloc[:, -1].value_counts()
这里简单说下iloc
的用法,iloc[[行], [列]]
其中的行的列表表示所要取的行的范围,列的列表同理。
逻辑回归
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4, input_shape=(15,), activation="relu"))
model.add(tf.keras.layers.Dense(1, input_shape=(4,), activation="sigmoid"))
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=['accuracy'])
datas = pd.read_csv("credit-a.csv", header=None)
x = datas.iloc[:, 0:-1]
y = datas.iloc[:, -1].replace(-1, 0)
his = model.fit(x, y, epochs=500)
x_test = datas.iloc[:9, 0:-1]
y_test = datas.iloc[:9, -1]
y_predict = model.predict(x_test)
注意到使用的是binary_crossentropy
作为损失函数,最后的输出层的激活函数使用的是sigmoid
激活函数。
可以绘制下loss
的变化过程:
plt.plot(his.epoch, his.history['loss'])
绘制下accuracy
在训练过程中的变化:
plt.plot(his.epoch, his.history['accuracy'])
最后,可以来进行预测分类:
resu = []
for predict in y_predict:
resu.append(np.random.choice([0,1],size=1,p = [1-predict[0], predict[0]])[0])
print(resu)
而真实值,如下图:
上面在训练中将-1
处理为了0
,故这里真实值是全0
。
但,其实说明不了问题的,因为直接使用了训练数据来测试,无疑是不对的。
不妨用iloc
那个方法来切两半,一半训练0.8
,一半测试0.2
。当然,这里不做了。