通过对[“年度”, “季度”, “地区”, “国家”, “服务分类”]进行分组,求出”销售额"和”利润“总值
sale = year_quarter.groupby(["年度", "季度", "地区", "国家", "服务分类"])["销售额"].sum() sale = pd.DataFrame(sale) sale
输出为:
profit = year_quarter.groupby(["年度", "季度", "地区", "国家", "服务分类"])["利润"].sum() profit = pd.DataFrame(profit) profit
输出为:
# 拼接销售额与利润 sale["利润"] = profit["利润"].values sale.to_csv("./第一题.csv") sale
输出为:
# 查看保存的数据 n1 = pd.read_csv("./第一题.csv") n1
输出为:
获取第一季度数据
forecast_data = n1[n1.loc[:, "季度"] == 1] # 拿出第一季度 forecast_data
输出为:
因为列”地区“,”国家“,”服务分类"中存在汉字,而逻辑回归只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是[“小 学”,“初中”,“高中”,“大学”],付费方式可能包含[“支付宝”,“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。
这里我们采用preprocessing.LabelEncoder将汉字进行编码
# 对列地区,国家,服务分类 进行编码 from sklearn.preprocessing import LabelEncoder y1 = forecast_data.loc[:, "地区"] # 要输入的是标签,不是特征矩阵,所以允许一维数据 y2 = forecast_data.loc[:, "国家"] y3 = forecast_data.loc[:, "服务分类"] le1 = LabelEncoder() # 实例化 le1 = le1.fit(y1) # 导入数据 label1 = le1.transform(y1) # transform接口调取结果 forecast_data.loc[:,"地区"] = label1 le2 = LabelEncoder() # 实例化 le2 = le2.fit(y2) # 导入数据 label2 = le2.transform(y2) # transform接口调取结果 forecast_data.loc[:,"国家"] = label2 le3 = LabelEncoder() # 实例化 le3 = le3.fit(y3) # 导入数据 label3 = le3.transform(y3) # transform接口调取结果 forecast_data.loc[:,"服务分类"] = label3 forecast_data
输出为:
备注:这里的警告问题可以参考博客https://blog.csdn.net/weixin_42575020/article/details/98846427
from sklearn.linear_model import LogisticRegression as LR # 逻辑回归 from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 精确性分数 X1 = forecast_data.loc[:, ["年度", "地区", "国家", "服务分类", "利润"]] X1 X2 = forecast_data.loc[:, ["年度", "地区", "国家", "服务分类", "销售额"]] X2
输出为:
建模
正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项penalty:可以输入”l1“或者”l2“来指定使用哪一种正则化方式,不填写默认使用”l2“,注意:若选择”l1“正则化,参数solver仅能够使用的求解方式”liblinear“和”sage“
C:C正则化强度的倒数,必须是一个大于0的浮点数,不填写默认是1.0,即默认正则化与损失函数的比值是1:1,C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效果越强,参数θ会逐渐被压缩得越来越小。
L1正则化和L2正则化虽然都可以控制过拟合,但它们的效果并不相同。当正则化强度逐渐增大(即C逐渐变小),参数θ 的取值会逐渐变小,但L1正则化会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0。
y = forecast_data.loc[:, "销售额"] y2 = forecast_data.loc[:, "利润"] lrl1 = LR(penalty = "l1", solver = "liblinear", C = 0.5, max_iter = 1000) lrl2 = LR(penalty = "l1", solver = "liblinear", C = 0.5, max_iter = 1000) # 逻辑回归的重要属性coef_, 查看某个特征所对应的参数 lrl1 = lrl1.fit(X1, y.astype("int")) lrl2 = lrl2.fit(X2, y2.astype("int"))
1.4.2预测2021年第一季度各个地区,国家,服务分类的销售额和利润
通过模型预测2021年第一季度各个地区,国家,服务分类的销售额和利润
X_test1 = X1 X_test1["年度"] = [2021 for i in range(X1.shape[0])] X_test1
输出为:
X_test2 = X2 X_test2
输出为:
查看预测结果:
lrl_pro1 = lrl1.predict(X_test1) lrl_pro1[0:5]
输出为:
lrl_pro2 = lrl2.predict(X_test2) lrl_pro2[0:5]
输出为:
X_test = X_test1.loc[:, ["年度", "地区", "国家", "服务分类"]] X_test