Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scikit的MLPC分类器(和其他分类器)训练分数低_Python_Machine Learning_Scikit Learn - Fatal编程技术网

Python scikit的MLPC分类器(和其他分类器)训练分数低

Python scikit的MLPC分类器(和其他分类器)训练分数低,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,(更新:作为单独答案的最终调查结果) 我开始尝试了解如何使用scikit模型进行培训。我已经用iris、MNIST等知名数据集进行了实验——它们都是结构良好的数据,随时可以使用。这是我第一次尝试用自己的原始数据构建模型,结果并不理想 我选择使用的数据是过去3年的数据 这是数据的快照,让您不必下载数据就可以了解字段 我的第一个实验很简单-尝试建立一个模型,给定“许可证状态代码”和“年龄”,尝试预测性别(M或F) 将熊猫作为pd导入 将matplotlib.pyplot作为plt导入 将numpy

(更新:作为单独答案的最终调查结果)

我开始尝试了解如何使用scikit模型进行培训。我已经用iris、MNIST等知名数据集进行了实验——它们都是结构良好的数据,随时可以使用。这是我第一次尝试用自己的原始数据构建模型,结果并不理想

我选择使用的数据是过去3年的数据

这是数据的快照,让您不必下载数据就可以了解字段

我的第一个实验很简单-尝试建立一个模型,给定“许可证状态代码”和“年龄”,尝试预测性别(M或F)

将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将numpy作为np导入
从sklearn.cluster导入KMeans
从sklearn.decomposition导入PCA
从sklearn.preprocessing导入标签编码器
从sklearn.preprocessing导入StandardScaler
从sklearn.model\u选择导入列车\u测试\u拆分
从sklearn.employ导入随机林分类器
从SKM学习导入度量
从sklearn.neural_网络导入MLP分类器
从sklearn.model_选择导入学习曲线
从sklearn.model_选择导入ShuffleSplit
导入tensorflow.contrib.learn作为skflow
从tensorflow.contrib.learn.python.learn.estimators导入运行配置
从sklearn.svm导入SVC
进口腌菜,海产
def绘图学习曲线(估计器、标题、X、y、ylim=None、cv=None、,
n_jobs=1,train_size=np.linspace(.1,1.0,5)):
#http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html
plt.图()
标题(标题)
如果ylim不是None:
plt.ylim(*ylim)
plt.xlabel(“培训示例”)
plt.ylabel(“分数”)
训练规模、训练分数、测试分数=学习曲线(
估计量,X,y,cv=cv,n_作业=n_作业,序列号=序列号)
训练分数平均值=np.平均值(训练分数,轴=1)
列分数标准=np.std(列分数,轴=1)
测试分数平均值=np.平均值(测试分数,轴=1)
测试分数标准=np.std(测试分数,轴=1)
plt.grid()
在(序列尺寸、序列分数、平均值-序列分数、标准值、,
训练分数平均值+训练分数标准,α=0.1,
color=“r”)
在(列车尺寸、测试分数、平均值-测试分数、标准、,
测试分数平均值+测试分数标准,α=0.1,color=“g”)
plt.plot(系列尺寸、系列分数表示“o-”,color=“r”,
label=“培训分数”)
plt.plot(序列尺寸、测试分数表示“o-”,color=“g”,
label=“交叉验证分数”)
plt.图例(loc=“最佳”)
plt.show()
#主要
crasks=pd.read\u csv(“crasks.csv”,nrows=100000)
#扔掉无用的可乐
碰撞。下降([“年”、“案例个人ID”、“案例车辆ID”、“运输
“受伤地点”、“角色类型”],轴=1,在位=真)
崩溃=崩溃[pd.notnull(崩溃['Age'])]
崩溃=崩溃[crasks.Age>=10]#存在年龄<10的垃圾数据。我想他们不会开车
#让我们删除空的行
崩溃=崩溃[pd.notnull(崩溃['License State Code'])]
碰撞=碰撞[pd.notnull(碰撞[‘伤害严重程度’])]
碰撞=碰撞[pd.notnull(碰撞[‘安全设备’])]
崩溃=崩溃[pd.notnull(崩溃['Sex'])]
#将文本字段转换为数值
le=标签编码()
崩溃=崩溃[crasks.columns[:].apply(le.fit_transform)
崩溃=崩溃。获取数字数据()
#让我们绘制一张热图来显示相关性
corr=crasks.corr()
ax=seaborn.heatmap(corr,xticklabels=corr.columns.values,
yticklabels=corr.columns.values,annot=True)
plt.setp(ax.xaxis.get_majorticklabels(),旋转=45)
plt.setp(ax.yaxis.get_majorticklabels(),旋转=-45)
plt.show()
碰撞列车,碰撞试验=列车试验分离(碰撞,试验尺寸=0.2)
Y_火车=撞车[性别]
X_-train=碰撞_-train['年龄','许可证状态代码']]
Y_试验=碰撞试验['Sex']
X_测试=崩溃_测试[['年龄','许可证状态代码']]
名称\u train=碰撞\u train.columns.values
打印“列车尺寸”,len(X_列车)
打印“测试尺寸”,透镜(X_测试)
#
#cls=RandomForestClassifier(verbose=True)
#
cls=MLP分类器(隐藏层尺寸=(10,10,10),最大iter=500,α=1e-4,
解算器='sgd',详细=10,tol=1e-4,随机状态=1,
学习率(初始值=0.01)
#cls=tf.contrib.learn.DNNClassifier(功能列=专长,
#隐藏单位=[50,50,50],
#n_类=3)
#
#
#cls=SVC(verbose=True)
打印“配件…”
cls.fit(X_系列、Y_系列)
绘制学习曲线(cls,“碰撞学习”、X\U列车、Y\U列车)
打印(“培训集分数:%f”%cls.score(X\U系列,Y\U系列))
打印(“测试集分数:%f”%cls.score(X\u测试,Y\u测试))
我尝试了多种模型(从RandomForest到SVC再到MLP等等)——它们都得出了大约0.56分的训练分数和0.6倍的损失

最后,以下是在当前配置中为MLP生成的绘图:

这是我切换到RandomForest时的绘图

看起来RandomForest中的分数有所下降,但总的来说,它的结局与MLP类似。我做错了什么?如何改进这种方法?谢谢

编辑:根据下面的两个答案,我绘制了所有列之间相关性的热图(在删除明显无用的列之后)——这很糟糕,但这是正确的方法吗?我也可以做主成分分析,但如果基本的场间相关性很差,这是否表明数据集在很大程度上无法用于预测


问题不在于模型,而在于数据。”“年龄”和“许可证状态代码”不是确定“性别”的最佳参数

尝试使用相同的模型来预测“安全设备”的“伤害严重程度”,你会得到更好的结果。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import learning_curve
from sklearn.model_selection import ShuffleSplit
import tensorflow.contrib.learn as skflow
from tensorflow.contrib.learn.python.learn.estimators import run_config
from sklearn.svm import SVC
import pickle, seaborn


def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
                        n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):
    #http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html
    plt.figure()
    plt.title(title)
    if ylim is not None:
        plt.ylim(*ylim)
    plt.xlabel("Training examples")
    plt.ylabel("Score")
    train_sizes, train_scores, test_scores = learning_curve(
        estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
    train_scores_mean = np.mean(train_scores, axis=1)
    train_scores_std = np.std(train_scores, axis=1)
    test_scores_mean = np.mean(test_scores, axis=1)
    test_scores_std = np.std(test_scores, axis=1)
    plt.grid()

    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
                     train_scores_mean + train_scores_std, alpha=0.1,
                     color="r")
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
                     test_scores_mean + test_scores_std, alpha=0.1, color="g")
    plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
             label="Training score")
    plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
             label="Cross-validation score")

    plt.legend(loc="best")
    plt.show()

#MAIN

crashes = pd.read_csv("crashes.csv", nrows=100000)

# drop useless cols

crashes.drop(["Year","Case Individual ID", "Case Vehicle ID", "Transported    
By", "Injury Location", "Role Type"],axis=1, inplace=True)

crashes = crashes [pd.notnull(crashes['Age'])]
crashes = crashes[crashes.Age >= 10 ] # There are ages < 10 - likely junk data. I don't think they drive


# lets drop rows that are empty
crashes = crashes [pd.notnull(crashes['License State Code'])]
crashes = crashes [pd.notnull(crashes['Injury Severity'])]
crashes = crashes [pd.notnull(crashes['Safety Equipment'])]
crashes = crashes [pd.notnull(crashes['Sex'])]

# converts text fields to numerical values
le = LabelEncoder()
crashes = crashes[crashes.columns[:]].apply(le.fit_transform)
crashes = crashes._get_numeric_data()

# lets plot a heat map to show correlation
corr = crashes.corr()
ax = seaborn.heatmap (corr, xticklabels=corr.columns.values,    
yticklabels=corr.columns.values, annot=True)
plt.setp( ax.xaxis.get_majorticklabels(), rotation=45 )
plt.setp( ax.yaxis.get_majorticklabels(), rotation=-45 )
plt.show()

crashes_train, crashes_test = train_test_split(crashes, test_size = 0.2)
Y_train = crashes_train['Sex']
X_train =  crashes_train[[ 'Age',  'License State Code']]
Y_test = crashes_test['Sex']
X_test =  crashes_test[[ 'Age', 'License State Code']]


names_train  = crashes_train.columns.values

print "train size ",len (X_train)
print "test size",len (X_test)
#
# cls = RandomForestClassifier(verbose = True)
#
cls = MLPClassifier(hidden_layer_sizes=(10,10,10), max_iter=500, alpha=1e-4,
                  solver='sgd', verbose=10, tol=1e-4, random_state=1,
                  learning_rate_init=0.01)

#cls = tf.contrib.learn.DNNClassifier(feature_columns=feats, 
#                                               hidden_units=[50, 50, 50], 
#                                              n_classes=3)

#
#

#cls = SVC(verbose = True)

print "Fitting..."
cls.fit(X_train, Y_train)

plot_learning_curve(cls,"Crash Learning", X_train, Y_train)


print("Training set score: %f" % cls.score(X_train, Y_train))
print("Test set score: %f" % cls.score(X_test, Y_test))