• 线性回归分析----学院综测成绩能显示出什么信息?


    • 有趣的故事,每年学院评奖的时候,都会有许许多多狗血的剧情。。
    • 综测规则  德育成绩*0.5+智育成绩+劳育成绩+体育成绩+美育成绩+特别奖励分数
      • 德育成绩满分 100 分
      • 智育成绩满分  20  分
      • 劳育成绩满分  10  分
      • 体育成绩满分  10  分
      • 美育成绩满分  10  分
      • 特别奖励分数   无上限
    • 分析数据(Pandas)
    1. import xlrd as xl
    2. from bunch import *
    3. Data1 = Bunch()
    4. Data2 = Bunch()
    5. Data3 = Bunch()
    6. data1 = xl.open_workbook("1.xls")
    7. data2 = xl.open_workbook("2.xls")
    8. data3 = xl.open_workbook("3.xls")
    9. work_sheet1 = data1.sheets()[0]
    10. work_sheet2 = data2.sheets()[0]
    11. work_sheet3 = data3.sheets()[0]
    12. all_rows1 = work_sheet1.nrows
    13. all_rows2 = work_sheet2.nrows
    14. all_rows3 = work_sheet3.nrows
    15. all_cols1 = work_sheet1.ncols
    16. all_cols2 = work_sheet2.ncols
    17. all_cols3 = work_sheet3.ncols
    • 讲个有趣的事情,为什么我们不选用更高效的方法,而是建立这么多变量呢?
      • 解决方法一:建立一个线性列表
        • 劣势
          • 太笨,脑子记不住位置
      • 解决方法二:
          1. list0,list1,list2,list3 = [],[],[],[]
          2. start = "list"
          3. for i in range(4):
          4. c = start + str(i)
          5. eval(c).append(1)
          6. print("list0",end=" ")
          7. print(list0)
          8. >>>list0 [1]

    你看,这个eval()函数就很好。

    • sklearn 模块
      • 话说,为什么要用sklearn模块呢? 好问题,难道你想从头搭建吗?博主数学不好。博主还很担心他的工程数学数值计算呢?笑死,复变函数都快挂了。。
      • 线性回归
        • 突然想起来应该介绍一下我们的数据,不然在操作的部分会有些看不懂,但是,不介绍并不特别重要。你可能需要带点想象,比如第一列是性别,第二列是学号,第三列是班级号啥的
      • Bunch 模块
        • 用它习惯了。机器学习中特别需要这个模块,用起来很方便,就像字典一样。
    1. feature = []
    2. for i in range(1,all_rows1):
    3. d = []
    4. for j in range(3,all_cols1-2):
    5. d.append(work_sheet1.cell_value(i,j))
    6. feature.append(d)
    7. Data1["feature"] = feature
    8. target = []
    9. for i in range(1,all_rows1):
    10. target.append(work_sheet1.cell_value(i,all_cols1-2))
    11. Data1["target"] = target
    •  LinearRegression模块
      • 以直线拟合(游戏规则说明了,变量之间是没有相互作用的。)
        1. from sklearn.linear_model import LinearRegression
        2. regression = LinearRegression()
        3. model = regression.fit(Data1["feature"],Data1["target"])
        4. print("1 model.intercept_",end = " ")
        5. print(model.intercept_)
        6. print("model.coef_",end=" ")
        7. print(model.coef_)
    • 输出结果
        1. 1 model.intercept_ -0.00040030675346258704
        2. model.coef_ [0.50008753 0.99928412 0.99998659 1.00022466 1.0001154 ]
        3. 2 model.intercept_ 1.3076787747084921
        4. model.coef_ [0.49392547 0.93628899 0.96930705 1.05106066 1.0070238 ]
        5. 3 model.intercept_ -8.526512829121202e-14
        6. model.coef_ [0.5 1. 1. 1. 1. ]
    • 简单的结果分析
      • 学院1和学院3无论是拟合系数还是在截距上都比较符合预期
      • 学院2似乎有点小奇怪,看上去获得特别奖励加分的人很多哦。要不然就是。。(阴谋论)
      • 好吧,我们下一步就是要找出那些不太合乎常理的数值
    • 找出异常值
      • assert()语句 这个语句很有用,比如我们如果怀疑,这个偏差是因为漏缺数据导致的,那么可以先assert()一些确定的事情。这样就省的跑出一堆没用的数据还傻呵呵的。就像C语言一样,咋都能跑出点东西。乐死,根本不知道对不对。
      • abs(i_{actual}-i_{predict})/i_{predict}
        1. assert(len(Data2["target"])==len(Data2["feature"])),"wrong!"
        2. S = []
        3. for i in range(1,all_rows2-2):
        4. try:
        5. sum = 0.5 * Data2["feature"][i][0]
        6. except:
        7. print(i)
        8. for j in range(1,len(Data2["feature"][i])):
        9. sum += Data2["feature"][i][j]
        10. S.append(sum)
        11. Q = []
        12. for i in range(len(S)):
        13. Q.append((S[i]-Data2["target"][i])/Data2["target"][i])
        14. Q = [abs(i) for i in Q]
      •  结果输出
        • 我们只想分析前十个数据
          1. Q = [abs(i) for i in Q]
          2. Q1 = [i for i in Q]
          3. for i in range(10):
          4. t = Q.index(max(Q1))
          5. print(t,end=" ")
          6. print(max(Q1))
          7. Q1.remove(max(Q1))
          8. >>>
          9. >>>
          10. 7 0.10667617011166551
          11. 44 0.04207573632538569
          12. 70 0.03807947019867545
          13. 69 0.027375201288244812
          14. 65 0.026153846153846198
          15. 71 0.018932874354561126
          16. 58 0.017569546120058607
          17. 72 0.017543859649122806
          18. 14 0.017052375152253246
          19. 30 0.01686121919584951

    • 除了线性回归,难度就没有其他的回归方法吗?
      • 当然有,我们可以用随机森林回归   
    1. from sklearn.ensemble import RandomForestRegressor
    2. features = Data1["feature"]
    3. targets = Data1["target"]
    4. randomforest = RandomForestRegressor(random_state=0)
    5. model = randomforest.fit(features,targets)

     这个误差显然有一点点大的。。

    1. >>>model.predict([[90,10,10,10,10],[80,20,10,10,10],[95,10,10,10,10],[90,15,5,10,10],[85,20,10,0,10],[100,10,10,10,10]])
    2. >>>array([82.746 , 80.1668, 86.5164, 82.6754, 73.749 , 88.352 ])

    好了,我们的分析将继续。

    那我们能不能让随机森林干点更有用的事情呢?

    比如,我们按同学的分数打等第。

    1. from sklearn.ensemble import RandomForestClassifier
    2. Data1["target"] = [2*(i>=90)+1*((i<90)&(i>80))+0 for i in Data1["target"]]
    3. randomforest = RandomForestClassifier(random_state=0)
    4. model = randomforest.fit(Data1["feature"],Data1["target"]

    程序的第二行,是一个很有用的编程小技巧。值得记录

    1. >>>model.predict([[100,20,10,10,10],[90,10,10,10,10],[80,20,10,10,10],[100,0,10,10,10]])
    2. >>>array([2, 1, 0, 1])

    嗯,效果还是不尽人意

    为什么呢?

    • 原因分析
      • 这与我们没有做数据标准化有关,大家的德育分数都很高,在这样的情况下,如果一个人的德育成绩偏低,很可能发生错误归类。数据标准化不能完全避免这种结果,但一定程度上能削弱这种误差,但也有反例。
      • 这与随机森林的原理关系很大。
        • 随机森林强调分类,不注重机理,变量之间的关系并不是它考虑的
        • 因此,在很多建模比赛中,线性回归往往是值得关注的。
    • 全篇完
  • 相关阅读:
    excel中公式结合实际的数据提取出公式计算的分支
    JAVA最佳学习方法
    设备树和uboot启动,kernel启动
    正则表达式转换为相应的文字小工具
    带你了解如何防御DDoS攻击
    vue的第3篇 第一个vue程序
    Games104现代游戏引擎入门-lecture14游戏引擎的引擎工具高级概念与应用
    数据处理过程中的解决办法
    客厅窗帘要安装纱帘吗?怎么选择纱帘?-好佳居窗帘十大品牌
    Stream常用操作以及原理探索
  • 原文地址:https://blog.csdn.net/Chandler_river/article/details/126854481