其实我记得我以前遇到过这个问题也记录下来过,但是忘记记录在哪个本子上了:顺利生成了csv文件,用Notepad打开是正常的,但用excel打开时就不是正常的。
当我用“\t”作为分隔符生成csv文件,然后用自带的工具打开时:正常如下
但用excel打开时却是:
然后我将"\t"改成了","就可以了,无论用什么工具打开csv都正常:
可以看到这个csv文件其实有400行839列的,但是在python里用pandas.read_csv()读出来却是:399X839?
这样生成的:
FILE *txtfile=fopen("/opt/jiaojiazao/posite/train.csv", "w");
//ofstream txtfile("/opt/jiaojiazao_test/posite/test.txt",ios::out);
for (int img_ind_pos = 0; img_ind_pos != 200; img_ind_pos++)
{
sprintf(srcimgs, "/opt/jiaojiazao/posite/%d.JPG", img_ind_pos);
Mat src = imread(srcimgs,0);
resize(src, trainHOG0, Size(64, 32));
vector<float>descriptors0;
descriptors0.clear();
hog0.compute(trainHOG0, descriptors0, cv::Size(8, 8));
equalizeHist(trainHOG0, trainHOG0);
int newargu = calcLBPH(trainHOG0, pLBP0);
Mat LBPH00;
LBPH00 = spatial_histogram(pLBP0, 10, 4, 2, true);
int label = 1;
fprintf(txtfile,"%d,",label); //use "," instead of "\t"
//txtfile << label << "\t";
float f_testdata[DIM_OF_SAMPLE64X32] = { 0.0f };
for (int i = 0; i < DIM_OF_SAMPLE64X32; i++)
{
if (i < DIM_OF_HOG64X32)
{
f_testdata[i] = descriptors0[i];
fprintf(txtfile,"%f,",descriptors0[i]);
//txtfile << descriptors0[i] << "\t";
}
else if (i < DIM_OF_HOG64X32+DIM_OF_LBP1)
{
f_testdata[i] = LBPH00.at<float>(0, i - DIM_OF_HOG64X32);
fprintf(txtfile,"%f,",LBPH00.at<float>(0, i - DIM_OF_HOG64X32));
//txtfile << LBPH00.at<float>(0, i - DIM_OF_HOG64X32) << "\t";
}
else if (i == DIM_OF_SAMPLE64X32 - 2)
{
f_testdata[i] = (float)src.rows*src.cols / 1000.0f;
fprintf(txtfile,"%f,",(float)src.rows*src.cols / 1000.0f);
//txtfile << (float)src.rows*src.cols / 1000.0f << "\t";
}
else
{
f_testdata[i] = max((float)src.rows / (float)src.cols, (float)src.cols / (float)src.rows);
fprintf(txtfile,"%f\n",max((float)src.rows / (float)src.cols, (float)src.cols / (float)src.rows));
//txtfile << max((float)src.rows / (float)src.cols, (float)src.cols / (float)src.rows) << endl;
}
}
}
fclose(txtfile);
不知道为何读出来却掉了一行?我知道原因了:因为csv的第一行是列名称column_name!!!并不算在数据里!!所以自己给每列命名一个就好了:
现在用pandas.read_csv()打开就正确了!
现在终于可以二分类了:
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.cross_validation import train_test_split
#记录程序运行时间
import time
start_time = time.time()
#读入数据
train = pd.read_csv("/opt/jiaojiazao/posite/train.csv")
train_sz = train.shape
train_xy,val = train_test_split(train, test_size = 0.3,random_state=1)
y = train_xy.Label
X = train_xy.drop(["Label"],axis=1)
val_y = val.Label
val_X = val.drop(["Label"],axis=1)
xgb_val = xgb.DMatrix(val_X,label=val_y)
xgb_train = xgb.DMatrix(X, label=y)
tests = pd.read_csv("/opt/jiaojiazao_test/posite/test.csv")
xgb_test = xgb.DMatrix(tests)
params={
'booster':'gbtree',
'objective': 'binary:logistic', #多分类的问题
#'num_class':2, # 类别数,与 'objective': 'multi:softmax '并用
'gamma':0.6, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
'max_depth':9, # 构建树的深度,越大越容易过拟合
'lambda':2, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
'subsample':0.7, # 随机采样训练样本
'colsample_bytree':0.9, # 生成树时进行的列采样
'min_child_weight':3,
# 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
#,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
'silent':0 ,#设置成1则没有运行信息输出,最好是设置为0.
'eta': 0.1, # 如同学习率
'seed':1000,
'nthread':7,# cpu 线程数
'eval_metric': 'error'
'reg_alpha':10
#'updater'= 'grow_gpu'
}
plst = list(params.items())
num_rounds = 150 # 迭代次数
watchlist = [(xgb_train, 'train'),(xgb_val, 'val')]
#训练模型并保存
# early_stopping_rounds 当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
model = xgb.train(plst, xgb_train, num_rounds, watchlist,early_stopping_rounds=100)
model.save_model('./model/xgb.model') # 用于存储训练出的模型
print ("best best_ntree_limit",model.best_ntree_limit )
preds = model.predict(xgb_test,ntree_limit=model.best_ntree_limit)
np.savetxt('xgb_submission.csv',np.c_[range(1,len(tests)+1),preds],delimiter=',',header='ImageId,Label',comments='',fmt='%d')
#输出运行时长
cost_time = time.time()-start_time
print ("xgboost success!",'\n',"cost time:",cost_time,"(s)......")
、********************************************************************************
之前同事介绍说用蓝灯可以谷歌,但蓝灯有流量限制还是不方便,而且经常连接不上;今天同事告诉我另一个神器:超厉害啊:
然后就可以愉快谷歌了:
如果不能,那请将浏览器换成谷歌浏览器,不要用什么360极速或者别的浏览器。哦耶!!!