用MLPClassifer训练数据的神经网络
一个简单的神经网络
今天我们将使用的主要库叫做MLPClassifer。这个库没有任何反向传播,因此应该在具有二进制输出或输出节点很少的中小型数据集中使用。我们还将实现更多的库作为辅助工具。
我们将使用一个名为“exercise”的数据集,建立一个神经网络,根据人们的饮食和脉搏来预测人们锻炼的时间
import seaborn as sns
#import data
data = sns.load_dataset('exercise')
data.head()
从数据中我们可以明显地看到,列“kind”和“diet”是非整数值,这使得训练模型几乎是不可能的。
这就是LabelEncoder()的用武之地!
from sklearn.preprocessing import LabelEncoder
#one hot encoded the string columns
for label in ['diet', 'kind']:
data[label] = LabelEncoder().fit_transform(data[label])
我们在这里做的是将这两列的字符串值转换为一个整数,这样我们的模型可以更好地理解。
下一步是确定我们预测的产品是什么!我们将分别将数据和“target”分别放入X和Y中。
#set target and dataset or X and Y
y = data['kind']
X = data.drop(['kind'], axis = 1)
下一部分是它开始变得有趣的地方
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.neural_network import MLPClassifier
params = [{'solver': 'sgd', 'learning_rate': 'constant', 'momentum': 0,
'learning_rate_init': 0.2},
{'solver': 'sgd', 'learning_rate': 'constant', 'momentum': .9,
'nesterovs_momentum': False, 'learning_rate_init': 0.2},
{'solver': 'sgd', 'learning_rate': 'constant', 'momentum': .9,
'nesterovs_momentum': True, 'learning_rate_init': 0.2},
{'solver': 'sgd', 'learning_rate': 'invscaling', 'momentum': 0,
'learning_rate_init': 0.2},
{'solver': 'sgd', 'learning_rate': 'invscaling', 'momentum': .9,
'nesterovs_momentum': True, 'learning_rate_init': 0.2},
{'solver': 'sgd', 'learning_rate': 'invscaling', 'momentum': .9,
'nesterovs_momentum': False, 'learning_rate_init': 0.2},
{'solver': 'adam', 'learning_rate_init': 0.01}]
这里我们导入重要的模块。第一个模块是Matplotlib,我们将用它来可视化我们的神经网络。下一个是MinMaxScaler,这很重要,因为它允许我们将数据扩展为机器能够更好地处理的格式。最重要的是MLPClassifer,这很好,因为它允许我们设置不同的参数和学习风格,看哪一个最适合。
重要的是,您可以看到上面的参数。这些参数包括层数、每个层的神经元数、训练迭代数等等。所有这些都可以调整,其他的选项也可以添加到更好的性能。
def plot_on_dataset(X, y, ax, name):
# for each dataset, plot learning for each learning strategy
print("learning on dataset %s" % name)
ax.set_title(name)
X = MinMaxScaler().fit_transform(X)
mlps = []
if name == "digits":
# digits is larger but converges fairly quickly
max_iter = 15
else:
max_iter = 400
for label, param in zip(labels, params):
print("training: %s" % label)
mlp = MLPClassifier(verbose=0, random_state=0,
max_iter=max_iter, **param)
mlp.fit(X, y)
mlps.append(mlp)
print("Training set score: %f" % mlp.score(X, y))
print("Training set loss: %f" % mlp.loss_)
for mlp, label, args in zip(mlps, labels, plot_args):
ax.plot(mlp.loss_curve_, label=label, **args)
接下来我们来看一个函数它不仅绘制我们的数据它还会缩放X使用MLPClassifer和我们上面设置的参数来启动我们的神经网络。
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
data_sets = [(X,y)]
for ax, data, name in zip(axes.ravel(), data_sets, ['exercise']):
plot_on_dataset(*data, ax=ax, name=name)
# can scale up to 4 I only have 1 dataset
fig.legend(ax.get_lines(), labels, ncol=2, loc="upper center")
plt.show()
最后我们设置图形和轴,同时确保我们将data_set设置为X和y。在我们做完这些之后,我们将坐标轴和数据,然后设置图形的名称,最后用plt.show()
正如您所看到的,Neural Net的外观并不复杂,但大多数工作都来自于模型的数据准备和调整。