撤县设区.ipynb @c6bd822 — view markup · raw · history · blame
依托大数据的行政区划调整决策预测——以县(市)改区为例¶
汇报人:陈思瑾
数据收集与探索性数据分析¶
- 本文选取面板数据(1999-2018年)
《城市统计年鉴》《县域统计年鉴》《国民经济和社会发展统计公报》
- 区划信息来源于中华人民共和国民政部和中国行政区划网

- 本研究数据集中可选择的部分变量指标

特征选择¶
为了简化数据搜集,主要搜集6项指标:
行政区域面积 、
居民储蓄存款余额、
第一产业增加值、
第二产业增加值、
规模以上工业企业单位数、
年末金融机构各项贷款余额
其中,行政区域面积用于体现县(市)可供开发面积大小,居民储蓄存款余额用于体现县(市)居民实际经济条件,第一、二产业增加值用于体现县(市)农业、工业发展速度,规模以上工业企业单位数用于体现县(市)企业整体规模,年末金融机构各项贷款余额用于体现县(市)企业总体负债情况。
每个县(市)搜集其该区前10年的数据,保存在单个csv文件中,以下为"长乐区.csv"文件中数据,

对于未改区的县(市),搜集其所在省份改区县(市)同期的数据
读取文件名¶
县(市)改区数据路径为./mydata/Yes/,
未县(市)改区数据路径为./mydata/No/
In [35]:
# pandas 即 Python Data Analysis Library
import pandas as pd
import os
# 县市改区 数据路径
yesPath = './mydata/Yes/'
# 县市改区 数据路径
noPath = './mydata/No/'
# 读取给定路径的下所有csv文件,存于list csvFiles中,并作为返回值返回
def get_file_name(dataPath):
csvFiles = []
# root:当前目录路径 dirs:当前目录下所有子目录 files:当前路径下所有非目录文件
for root,dirs,files in os.walk(dataPath):
#(files)
for file in files:
#for i,file in enumerate(files):
if os.path.splitext(file)[1] == '.csv':
csvFiles.append(file)
break # 避免读取check_point文件
return csvFiles
fileNameYes = get_file_name(yesPath)
fileNameNo = get_file_name(noPath)
# print(fileNameYes)
# print(fileNameNo)
读取csv表格数据¶
根据csv文件名称列表fileNameYes读取每个csv中的表格数据,存储到列表csv_data_yes中,元素格式为dataframe
dataframe为表格型数据结构,二维的数据模型
In [36]:
# 读取县(市)改区信息
# csv_data_yes列表 用于保存 县(市)改区 所有数据, 每个元素为一个dataframe(表格型数据结构)
csv_data_yes = []
for i in range(len(fileNameYes)):
csv_data_yes.append(pd.read_csv(yesPath+fileNameYes[i], error_bad_lines=False))
csv_data_yes[0].head()
# print(csv_data_yes)
Out[36]:
In [37]:
# 读取非县(市)改区信息
csv_data_no = []
for i in range(len(fileNameNo)):
csv_data_no.append(pd.read_csv(noPath+fileNameNo[i], error_bad_lines=False))
csv_data_no[0].head()
Out[37]:
In [38]:
import numpy as np
# 列表yes_no_data用于保存
# 列表yes_no用于保存tag(y值) 是否 县(市)改区,县(市)改区 = 'T', 非县(市)改区 = 'F'
yes_no_data = []
yes_no = []
for csv in csv_data_yes:
# 将dataframe 转换为 array
arr = csv.iloc[:,1:].values.copy()
# 将6x10转换为1x60
# arr.shape[0] = 6 行数目
# arr.shape[1] = 10 列数目
arr.resize(1,(arr.shape[0] * arr.shape[1]))
yes_no_data.append(pd.DataFrame(arr))
# 添加tag
yes_no.append('T')
for csv in csv_data_no:
arr = csv.iloc[:,1:].values.copy()
arr.resize(1,(arr.shape[0] * arr.shape[1]))
yes_no_data.append(pd.DataFrame(arr))
yes_no.append('F')
用concat函数将yes_no_data中所有dataframe数据整合到一个表中
In [39]:
# 设置ignore_index = true以去除index
total_data = pd.concat(yes_no_data, ignore_index=True)
total_data.tail()
Out[39]:
将列表yes_no转换为pandas一维数组
In [40]:
yes_no = pd.Series(yes_no)
yes_no.tail()
Out[40]:
样本划分¶
用train_test_split函数将样本数据随机划分为训练集(X_train、y_train)和测试集(X_test、y_test)
train_test_split随机客观的划分数据,减少人为因素
In [42]:
from sklearn.model_selection import train_test_split
# 把数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(total_data, yes_no,
test_size = 50, # 50
random_state = 2,
stratify = yes_no)
In [41]:
from time import time
from sklearn.metrics import f1_score
def train_classifier(clf, X_train, y_train):
''' 训练模型 '''
# 记录训练时长
start = time()
clf.fit(X_train, y_train)
end = time()
print("训练时间 {:.4f} 秒".format(end - start))
def predict_labels(clf, features, target):
''' 使用模型进行预测 '''
# 记录预测时长
start = time()
y_pred = clf.predict(features)
end = time()
print("预测时间 in {:.4f} 秒".format(end - start))
return f1_score(target, y_pred, pos_label='T'), sum(target == y_pred) / float(len(y_pred))
def train_predict(clf, X_train, y_train, X_test, y_test):
''' 训练并评估模型 '''
# Indicate the classifier and the training set size
print("训练 {} 模型,样本数量 {}. . .".format(clf.__class__.__name__, len(X_train)))
# 训练模型
train_classifier(clf, X_train, y_train)
# 在测试集上评估模型
f1, acc = predict_labels(clf, X_train, y_train)
print("训练集上的 F1 分数和准确率为: {:.4f} , {:.4f}.".format(f1 , acc))
f1, acc = predict_labels(clf, X_test, y_test)
print("测试集上的 F1 分数和准确率为: {:.4f} , {:.4f}.".format(f1 , acc))
安装xgboost包¶
In [12]:
!pip install xgboost
In [43]:
import xgboost as xgb
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
# 分别建立三个模型
clf_A = LogisticRegression(random_state = 42)
clf_B = SVC(random_state = 42, kernel='rbf',gamma='auto')
clf_C = xgb.XGBClassifier(seed = 42)
train_predict(clf_A, X_train, y_train, X_test, y_test)
print('')
train_predict(clf_B, X_train, y_train, X_test, y_test)
print('')
train_predict(clf_C, X_train, y_train, X_test, y_test)
print('')
为xgboost调参¶
In [44]:
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer
import xgboost as xgb
# 设置想要自动调参的参数
parameters = { 'n_estimators':[90,100,110],
'max_depth': [5,6,7],
}
# 初始化模型
clf = xgb.XGBClassifier(seed=42)
f1_scorer = make_scorer(f1_score,pos_label='T')
# 使用 grdi search 自动调参
grid_obj = GridSearchCV(clf,
scoring=f1_scorer,
param_grid=parameters,
cv=5) # 5
grid_obj = grid_obj.fit(X_train,y_train)
# 得到最佳的模型
clf = grid_obj.best_estimator_
print(clf)
# 查看最终的模型效果
f1, acc = predict_labels(clf, X_train, y_train)
print("F1 score and accuracy score for training set: {:.4f} , {:.4f}.".format(f1 , acc))
f1, acc = predict_labels(clf, X_test, y_test)
print("F1 score and accuracy score for test set: {:.4f} , {:.4f}.".format(f1 , acc))
安装joblib¶
joblib用于保存模型和加载模型
In [39]:
!pip install joblib
In [45]:
import joblib
#保存模型
joblib.dump(clf, 'xgboost_model.model')
#读取模型
xgb = joblib.load('xgboost_model.model')
In [46]:
# 随机挑选模型用于测试
sample1 = X_test.sample(n=1, random_state=8000)
sample1
Out[46]:
In [47]:
sample1.keys()
Out[47]:
In [48]:
# 进行模型预测
y_pred = xgb.predict(sample1)
y_pred
Out[48]:
In [76]:
# 用于生成handle函数的参数定义
total_year = 10
count = 0
def printParas(str1, str2, count):
for i in range(total_year):
count += 1
# 打印app_spec.yml参数
#print(' %s%d:'%(str1,i+1))
#print(' name: %s%d'%(str1,i+1))
#print(' value_type: float')
#print(' description: 县(市)改区前%d年%s(%s)'%(i+1,str1,str2))
#打印handle函数 参数
#print('\'%s%d\','%(str1,i+1), end='')
return count
count = printParas('行政区域面积', '平方公里', count)
count = printParas('第一产业增加值', '万元', count)
count = printParas('第二产业增加值', '万元', count)
count = printParas('居民储蓄存款余额', '万元', count)
count = printParas('年末金融机构各项贷款余额', '万元', count)
count = printParas('规模以上工业企业单位数', '个', count)
In [1]:
import pandas as pd
import joblib
def handle(conf):
"""
该方法是部署之后,其他人调用你的服务时候的处理方法。
请按规范填写参数结构,这样我们就能替你自动生成配置文件,方便其他人的调用。
范例:
params['key'] = value # value_type: str # description: some description
value_type 可以选择:img, video, audio, str, int, float, [int], [str], [float]
参数请放到params字典中,我们会自动解析该变量。
"""
df = pd.DataFrame(conf, index=[0])
conf_str = ['行政区域面积1','行政区域面积2','行政区域面积3','行政区域面积4','行政区域面积5',\
'行政区域面积6','行政区域面积7','行政区域面积8','行政区域面积9','行政区域面积10',\
'第一产业增加值1','第一产业增加值2','第一产业增加值3','第一产业增加值4','第一产业增加值5',\
'第一产业增加值6','第一产业增加值7','第一产业增加值8','第一产业增加值9','第一产业增加值10',\
'第二产业增加值1','第二产业增加值2','第二产业增加值3','第二产业增加值4','第二产业增加值5',\
'第二产业增加值6','第二产业增加值7','第二产业增加值8','第二产业增加值9','第二产业增加值10',\
'居民储蓄存款余额1','居民储蓄存款余额2','居民储蓄存款余额3','居民储蓄存款余额4','居民储蓄存款余额5',\
'居民储蓄存款余额6','居民储蓄存款余额7','居民储蓄存款余额8','居民储蓄存款余额9','居民储蓄存款余额10',\
'年末金融机构各项贷款余额1','年末金融机构各项贷款余额2','年末金融机构各项贷款余额3','年末金融机构各项贷款余额4','年末金融机构各项贷款余额5',\
'年末金融机构各项贷款余额6','年末金融机构各项贷款余额7','年末金融机构各项贷款余额8','年末金融机构各项贷款余额9','年末金融机构各项贷款余额10',\
'规模以上工业企业单位数1','规模以上工业企业单位数2','规模以上工业企业单位数3','规模以上工业企业单位数4','规模以上工业企业单位数5',\
'规模以上工业企业单位数6','规模以上工业企业单位数7','规模以上工业企业单位数8','规模以上工业企业单位数9','规模以上工业企业单位数10']
df = df[conf_str]
model = joblib.load('xgboost_model.model')
result = model.predict(df)
return {'res': result.tolist()[0]}
Reference¶
- pandas https://pandas.pydata.org/pandas-docs/stable/index.html
- 采用 Python 机器学习预测足球比赛结果 https://blog.csdn.net/weixin_44015907/article/details/89947334
In [ ]:
