• sklearn机器学习——day11


    案例:预测明天是否会下雨

    1. #导入需要的库
    2. import pandas as pd
    3. import numpy as np
    4. from sklearn.model_selection import train_test_split
    5. #导入数据,探索数据
    6. weather = pd.read_csv(r"C:\work\learnbetter\micro-class\week 8 SVM
    7. (2)\data\weatherAUS5000.csv",index_col=0)
    8. weather.head()
    9. #将特征矩阵和标签Y分开
    10. X = weather.iloc[:,:-1]
    11. Y = weather.iloc[:,-1]
    12. X.shape
    13. #探索数据类型
    14. X.info()
    15. #探索缺失值
    16. X.isnull().mean()
    17. #探索标签的分类
    18. np.unique(Y)
    19. #分集,优先探索标签
    20. #分训练集和测试集
    21. Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,Y,test_size=0.3,random_state=420)
    22. #恢复索引
    23. for i in [Xtrain, Xtest, Ytrain, Ytest]:
    24. i.index = range(i.shape[0])
    25. #是否有样本不平衡问题?
    26. Ytrain.value_counts()
    27. Ytest.value_counts()
    28. #将标签编码
    29. from sklearn.preprocessing import LabelEncoder
    30. encorder = LabelEncoder().fit(Ytrain)
    31. Ytrain = pd.DataFrame(encorder.transform(Ytrain))
    32. Ytest = pd.DataFrame(encorder.transform(Ytest))
    33. #探索特征,开始处理特征矩阵
    34. #描述性统计
    35. Xtrain.describe([0.01,0.05,0.1,0.25,0.5,0.75,0.9,0.99]).T
    36. Xtest.describe([0.01,0.05,0.1,0.25,0.5,0.75,0.9,0.99]).T
    37. """
    38. 对于去kaggle上下载了数据的小伙伴们,以及坚持要使用完整版数据的(15W行)小伙伴们
    39. 如果你发现了异常值,首先你要观察,这个异常值出现的频率
    40. 如果异常值只出现了一次,多半是输入错误,直接把异常值删除
    41. 如果异常值出现了多次,去跟业务人员沟通,可能这是某种特殊表示,如果是人为造成的错误,异常值留着是没有用
    42. 的,只要数据量不是太大,都可以删除
    43. 如果异常值占到你总数据量的10%以上了,不能轻易删除。可以考虑把异常值替换成非异常但是非干扰的项,比如说用0
    44. 来进行替换,或者把异常当缺失值,用均值或者众数来进行替换
    45. """
    46. #先查看原始的数据结构
    47. Xtrain.shape
    48. Xtest.shape
    49. #观察异常值是大量存在,还是少数存在
    50. Xtrain.loc[Xtrain.loc[:,"Cloud9am"] == 9,"Cloud9am"]
    51. Xtest.loc[Xtest.loc[:,"Cloud9am"] == 9,"Cloud9am"]
    52. Xtest.loc[Xtest.loc[:,"Cloud3pm"] == 9,"Cloud3pm"]
    53. #少数存在,于是采取删除的策略
    54. #注意如果删除特征矩阵,则必须连对应的标签一起删除,特征矩阵的行和标签的行必须要一一对应
    55. Xtrain = Xtrain.drop(index = 71737)
    56. Ytrain = Ytrain.drop(index = 71737)
    57. #删除完毕之后,观察原始的数据结构,确认删除正确
    58. Xtrain.shape
    59. Xtest = Xtest.drop(index = [19646,29632])
    60. Ytest = Ytest.drop(index = [19646,29632])
    61. Xtest.shape
    62. #进行任何行删除之后,千万记得要恢复索引
    63. for i in [Xtrain, Xtest, Ytrain, Ytest]:
    64. i.index = range(i.shape[0])
    65. Xtrain.head()
    66. Xtest.head()
    67. #处理困难特征:日期
    68. Xtrainc = Xtrain.copy()
    69. Xtrainc.sort_values(by="Location")
    70. Xtrain.iloc[:,0].value_counts()
    71. #首先,日期不是独一无二的,日期有重复
    72. #其次,在我们分训练集和测试集之后,日期也不是连续的,而是分散的
    73. #某一年的某一天倾向于会下雨?或者倾向于不会下雨吗?
    74. #不是日期影响了下雨与否,反而更多的是这一天的日照时间,湿度,温度等等这些因素影响了是否会下雨
    75. #光看日期,其实感觉它对我们的判断并无直接影响
    76. #如果我们把它当作连续型变量处理,那算法会人为它是一系列1~3000左右的数字,不会意识到这是日期
    77. Xtrain.iloc[:,0].value_counts().count()
    78. #如果我们把它当作分类型变量处理,类别太多,有2141类,如果换成数值型,会被直接当成连续型变量,如果做成哑
    79. 变量,我们特征的维度会爆炸
    80. Xtrain = Xtrain.drop(["Date"],axis=1)
    81. Xtest = Xtest.drop(["Date"],axis=1)
    82. #以将时间对气候的
    83. 连续影响,转换为”今天是否下雨“这个特征,巧妙地将样本对应标签之间的联系,转换成是特征与标签之间的联系
    84. Xtrain["Rainfall"].head(20)
    85. Xtrain.loc[Xtrain["Rainfall"] >= 1,"RainToday"] = "Yes"
    86. Xtrain.loc[Xtrain["Rainfall"] < 1,"RainToday"] = "No"
    87. Xtrain.loc[Xtrain["Rainfall"] == np.nan,"RainToday"] = np.nan
    88. Xtest.loc[Xtest["Rainfall"] >= 1,"RainToday"] = "Yes"
    89. Xtest.loc[Xtest["Rainfall"] < 1,"RainToday"] = "No"
    90. Xtest.loc[Xtest["Rainfall"] == np.nan,"RainToday"] = np.nan
    91. Xtrain.head()
    92. Xtest.head()
    93. int(Xtrain.loc[0,"Date"].split("-")[1]) #提取出月份
    94. Xtrain["Date"] = Xtrain["Date"].apply(lambda x:int(x.split("-")[1]))
    95. #替换完毕后,我们需要修改列的名称
    96. #rename是比较少有的,可以用来修改单个列名的函数
    97. #我们通常都直接使用 df.columns = 某个列表 这样的形式来一次修改所有的列名
    98. #但rename允许我们只修改某个单独的列
    99. Xtrain = Xtrain.rename(columns={"Date":"Month"})
    100. Xtrain.head()
    101. Xtest["Date"] = Xtest["Date"].apply(lambda x:int(x.split("-")[1]))
    102. Xtest = Xtest.rename(columns={"Date":"Month"})
    103. Xtest.head()

    处理困难特征:地点

    我们需要让算法意识到,不同的地点因为气候不同,所以对“明天是否会下雨”有着不同的影响 

    爬取的各大城市的经纬度

    爬虫的代码如下所示:

    1. import time
    2. from selenium import webdriver #导入需要的模块,其中爬虫使用的是selenium
    3. import pandas as pd
    4. import numpy as np
    5. df = pd.DataFrame(index=range(len(cityname))) #创建新dataframe用于存储爬取的数据
    6. driver = webdriver.Chrome() #调用谷歌浏览器
    7. time0 = time.time() #计时开始
    8. #循环开始
    9. for num, city in enumerate(cityname): #在城市名称中进行遍历
    10. driver.get('https://www.google.co.uk/webhp?
    11. hl=en&sa=X&ved=0ahUKEwimtcX24cTfAhUJE7wKHVkWB5AQPAgH')
    12. #首先打开谷歌主页
    13. time.sleep(0.3)
    14. #停留0.3秒让我们知道发生了什么
    15. search_box = driver.find_element_by_name('q') #锁定谷歌的搜索输入框
    16. search_box.send_keys('%s Australia Latitude and longitude' % (city)) #在输入框中输入
    17. “城市” 澳大利亚 经纬度
    18. search_box.submit() #enter,确认开始搜索
    19. result = driver.find_element_by_xpath('//div[@class="Z0LcW"]').text #?爬取需要的经纬
    20. 度,就是这里,怎么获取的呢?
    21. resultsplit = result.split(" ") #将爬取的结果用split进行分割
    22. df.loc[num,"City"] = city #向提前创建好的df中输入爬取的数据,第一列是城市名
    23. df.loc[num,"Latitude"] = resultsplit[0] #第二列是纬度
    24. df.loc[num,"Longitude"] = resultsplit[2] #第三列是经度
    25. df.loc[num,"Latitudedir"] = resultsplit[1] #第四列是纬度的方向
    26. df.loc[num,"Longitudedir"] = resultsplit[3] #第五列是经度的方向
    27. print("%i webcrawler successful for city %s" % (num,city)) #每次爬虫成功之后,就打印“城
    28. 市”成功了
    29. time.sleep(1) #全部爬取完毕后,停留1秒钟
    30. driver.quit() #关闭浏览器
    31. print(time.time() - time0) #打印所需的时间
    32. cityll = pd.read_csv(r"C:\work\learnbetter\micro-class\week 8 SVM
    33. (2)\cityll.csv",index_col=0)
    34. city_climate = pd.read_csv(r"C:\work\learnbetter\micro-class\week 8 SVM
    35. (2)\Cityclimate.csv")
    36. cityll.head()
    37. city_climate.head()
    38. #去掉度数符号
    39. cityll["Latitudenum"] = cityll["Latitude"].apply(lambda x:float(x[:-1]))
    40. cityll["Longitudenum"] = cityll["Longitude"].apply(lambda x:float(x[:-1]))
    41. #观察一下所有的经纬度方向都是一致的,全部是南纬,东经,因为澳大利亚在南半球,东半球
    42. #所以经纬度的方向我们可以舍弃了
    43. citylld = cityll.iloc[:,[0,5,6]]
    44. #将city_climate中的气候添加到我们的citylld中
    45. citylld["climate"] = city_climate.iloc[:,-1]
    46. citylld.head()
    47. #训练集中所有的地点
    48. cityname = Xtrain.iloc[:,1].value_counts().index.tolist()
    49. cityname
    50. import time
    51. from selenium import webdriver #导入需要的模块,其中爬虫使用的是selenium
    52. import pandas as pd
    53. import numpy as np
    54. df = pd.DataFrame(index=range(len(cityname))) #创建新dataframe用于存储爬取的数据
    55. driver = webdriver.Chrome() #调用谷歌浏览器
    56. time0 = time.time() #计时开始
    57. #循环开始
    58. for num, city in enumerate(cityname): #在城市名称中进行遍历
    59. driver.get('https://www.google.co.uk/webhp?
    60. hl=en&sa=X&ved=0ahUKEwimtcX24cTfAhUJE7wKHVkWB5AQPAgH')
    61. #首先打开谷歌主页
    62. time.sleep(0.3)
    63. #停留0.3秒让我们知道发生了什么
    64. search_box = driver.find_element_by_name('q') #锁定谷歌的搜索输入框
    65. search_box.send_keys('%s Australia Latitude and longitude' % (city)) #在输入框中输入
    66. “城市” 澳大利亚 经纬度
    67. search_box.submit() #enter,确认开始搜索
    68. result = driver.find_element_by_xpath('//div[@class="Z0LcW"]').text #?爬取需要的经纬
    69. 度,就是这里,怎么获取的呢?
    70. resultsplit = result.split(" ") #将爬取的结果用split进行分割
    71. df.loc[num,"City"] = city #向提前创建好的df中输入爬取的数据,第一列是城市名
    72. df.loc[num,"Latitude"] = resultsplit[0] #第二列是经度
    73. df.loc[num,"Longitude"] = resultsplit[2] #第三列是纬度
    74. df.loc[num,"Latitudedir"] = resultsplit[1] #第四列是经度的方向
    75. df.loc[num,"Longitudedir"] = resultsplit[3] #第五列是纬度的方向
    76. print("%i webcrawler successful for city %s" % (num,city)) #每次爬虫成功之后,就打印“城
    77. 市”成功了
    78. time.sleep(1) #全部爬取完毕后,停留1秒钟
    79. driver.quit() #关闭浏览器
    80. print(time.time() - time0) #打印所需的时间

    把cityll.csv和cityclimate.csv来导入,来看看它们是什么样子: 

    1. df.to_csv(r"C:\work\learnbetter\micro-class\week 8 SVM (2)\samplecity.csv")
    2. samplecity = pd.read_csv(r"C:\work\learnbetter\micro-class\week 8 SVM
    3. (2)\samplecity.csv",index_col=0)
    4. #我们对samplecity也执行同样的处理:去掉经纬度中度数的符号,并且舍弃我们的经纬度的方向
    5. samplecity["Latitudenum"] = samplecity["Latitude"].apply(lambda x:float(x[:-1]))
    6. samplecity["Longitudenum"] = samplecity["Longitude"].apply(lambda x:float(x[:-1]))
    7. samplecityd = samplecity.iloc[:,[0,5,6]]
    8. samplecityd.head()

    将这两张表处理成可以使用的样子,首先要去掉cityll中经纬度上带有的度数符号,然后要将两张表 合并起来。

    1. #去掉度数符号
    2. cityll["Latitudenum"] = cityll["Latitude"].apply(lambda x:float(x[:-1]))
    3. cityll["Longitudenum"] = cityll["Longitude"].apply(lambda x:float(x[:-1]))
    4. #观察一下所有的经纬度方向都是一致的,全部是南纬,东经,因为澳大利亚在南半球,东半球
    5. #所以经纬度的方向我们可以舍弃了
    6. citylld = cityll.iloc[:,[0,5,6]]
    7. #将city_climate中的气候添加到我们的citylld中
    8. citylld["climate"] = city_climate.iloc[:,-1]
    9. citylld.head()

    要计算距离,我们就会需要所有样本数据中的城市。我们认为,只有出现在训练集中的地点才 会出现在测试集中,基于这样的假设,我们来爬取训练集中所有的地点所对应的经纬度,并且保存在一个csv文件 samplecity.csv中:

    1. #训练集中所有的地点
    2. cityname = Xtrain.iloc[:,1].value_counts().index.tolist()
    3. cityname
    4. import time
    5. from selenium import webdriver #导入需要的模块,其中爬虫使用的是selenium
    6. import pandas as pd
    7. import numpy as np
    8. df = pd.DataFrame(index=range(len(cityname))) #创建新dataframe用于存储爬取的数据
    9. driver = webdriver.Chrome() #调用谷歌浏览器
    10. time0 = time.time() #计时开始
    11. #循环开始
    12. for num, city in enumerate(cityname): #在城市名称中进行遍历
    13. driver.get('https://www.google.co.uk/webhp?
    14. hl=en&sa=X&ved=0ahUKEwimtcX24cTfAhUJE7wKHVkWB5AQPAgH')
    15. #首先打开谷歌主页
    16. time.sleep(0.3)
    17. #停留0.3秒让我们知道发生了什么
    18. search_box = driver.find_element_by_name('q') #锁定谷歌的搜索输入框
    19. search_box.send_keys('%s Australia Latitude and longitude' % (city)) #在输入框中输入
    20. “城市” 澳大利亚 经纬度
    21. search_box.submit() #enter,确认开始搜索
    22. result = driver.find_element_by_xpath('//div[@class="Z0LcW"]').text #?爬取需要的经纬
    23. 度,就是这里,怎么获取的呢?
    24. resultsplit = result.split(" ") #将爬取的结果用split进行分割
    25. df.loc[num,"City"] = city #向提前创建好的df中输入爬取的数据,第一列是城市名
    26. df.loc[num,"Latitude"] = resultsplit[0] #第二列是经度
    27. df.loc[num,"Longitude"] = resultsplit[2] #第三列是纬度
    28. df.loc[num,"Latitudedir"] = resultsplit[1] #第四列是经度的方向
    29. df.loc[num,"Longitudedir"] = resultsplit[3] #第五列是纬度的方向
    30. print("%i webcrawler successful for city %s" % (num,city)) #每次爬虫成功之后,就打印“城
    31. 市”成功了
    32. time.sleep(1) #全部爬取完毕后,停留1秒钟
    33. driver.quit() #关闭浏览器
    34. print(time.time() - time0) #打印所需的时间
    35. df.to_csv(r"C:\work\learnbetter\micro-class\week 8 SVM (2)\samplecity.csv")

    爬取出的内容是什么样子:

    1. samplecity = pd.read_csv(r"C:\work\learnbetter\micro-class\week 8 SVM
    2. (2)\samplecity.csv",index_col=0)
    3. #我们对samplecity也执行同样的处理:去掉经纬度中度数的符号,并且舍弃我们的经纬度的方向
    4. samplecity["Latitudenum"] = samplecity["Latitude"].apply(lambda x:float(x[:-1]))
    5. samplecity["Longitudenum"] = samplecity["Longitude"].apply(lambda x:float(x[:-1]))
    6. samplecityd = samplecity.iloc[:,[0,5,6]]
    7. samplecityd.head()

    现在有了澳大利亚主要城市的经纬度和对应的气候,也有了我们的样本的地点所对应的经纬度,接下来 我们要开始计算我们样本上的地点到每个澳大利亚主要城市的距离,而离我们的样本地点最近的那个澳大利亚主要 城市的气候,就是我们样本点的气候。

     在地理上,两个地点之间的距离,由如下公式来进行计算:

    其中R是地球的半径,6371.01km,arccos是三角反余弦函数,slat是起始地点的纬度,slon是起始地点的经度, elat是结束地点的纬度,elon是结束地点的经度。本质还是计算两点之间的距离。而我们爬取的经纬度,本质其实 是角度,所以需要用各种三角函数和弧度公式将角度转换成距离。 

    1. #首先使用radians将角度转换成弧度
    2. from math import radians, sin, cos, acos
    3. citylld.loc[:,"slat"] = citylld.iloc[:,1].apply(lambda x : radians(x))
    4. citylld.loc[:,"slon"] = citylld.iloc[:,2].apply(lambda x : radians(x))
    5. samplecityd.loc[:,"elat"] = samplecityd.iloc[:,1].apply(lambda x : radians(x))
    6. samplecityd.loc[:,"elon"] = samplecityd.iloc[:,2].apply(lambda x : radians(x))
    7. import sys
    8. for i in range(samplecityd.shape[0]):
    9. slat = citylld.loc[:,"slat"]
    10. slon = citylld.loc[:,"slon"]
    11. elat = samplecityd.loc[i,"elat"]
    12. elon = samplecityd.loc[i,"elon"]
    13. dist = 6371.01 * np.arccos(np.sin(slat)*np.sin(elat) +
    14. np.cos(slat)*np.cos(elat)*np.cos(slon.values - elon))
    15. city_index = np.argsort(dist)[0]
    16. #每次计算后,取距离最近的城市,然后将最近的城市和城市对应的气候都匹配到samplecityd中
    17. samplecityd.loc[i,"closest_city"] = citylld.loc[city_index,"City"]
    18. samplecityd.loc[i,"climate"] = citylld.loc[city_index,"climate"]
    19. #查看最后的结果,需要检查城市匹配是否基本正确
    20. samplecityd.head()
    21. #查看气候的分布
    22. samplecityd["climate"].value_counts()
    23. #确认无误后,取出样本城市所对应的气候,并保存
    24. locafinal = samplecityd.iloc[:,[0,-1]]
    25. locafinal.head()
    26. locafinal.columns = ["Location","Climate"]
    27. #在这里设定locafinal的索引为地点,是为了之后进行map的匹配
    28. locafinal = locafinal.set_index(keys="Location")
    29. locafinal.to_csv(r"C:\work\learnbetter\micro-class\week 8 SVM (2)\samplelocation.csv")
    30. locafinal.head()
    31. #是否还记得训练集长什么样呢?
    32. Xtrain.head()
    33. #将location中的内容替换,并且确保匹配进入的气候字符串中不含有逗号,气候两边不含有空格
    34. #我们使用re这个模块来消除逗号
    35. #re.sub(希望替换的值,希望被替换成的值,要操作的字符串)
    36. #x.strip()是去掉空格的函数
    37. import re
    38. Xtrain["Location"] = Xtrain["Location"].map(locafinal.iloc[:,0]).apply(lambda
    39. x:re.sub(",","",x.strip()))
    40. Xtest["Location"] = Xtest["Location"].map(locafinal.iloc[:,0]).apply(lambda
    41. x:re.sub(",","",x.strip()))
    42. #修改特征内容之后,我们使用新列名“Climate”来替换之前的列名“Location”
    43. #注意这个命令一旦执行之后,就再没有列"Location"了,使用索引时要特别注意
    44. Xtrain = Xtrain.rename(columns={"Location":"Climate"})
    45. Xtest = Xtest.rename(columns={"Location":"Climate"})
    46. Xtrain.head()
    47. Xtest.head()

    处理分类型变量:缺失值 

    在sklearn当中,即便是我们的填补缺失值的类也需要由实例化,fit和接口调用执行填补三个步骤来进行,我们只需要实例化后,使用训练集 进行fit,然后在调用接口执行填补时用训练集fit后的结果分别来填补测试集和训练集就可以了

    1. #查看缺失值的缺失情况
    2. Xtrain.isnull().mean()
    3. #首先找出,分类型特征都有哪些
    4. cate = Xtrain.columns[Xtrain.dtypes == "object"].tolist()
    5. #除了特征类型为"object"的特征们,还有虽然用数字表示,但是本质为分类型特征的云层遮蔽程度
    6. cloud = ["Cloud9am","Cloud3pm"]
    7. cate = cate + cloud
    8. cate
    9. #对于分类型特征,我们使用众数来进行填补
    10. from sklearn.impute import SimpleImputer
    11. si = SimpleImputer(missing_values=np.nan,strategy="most_frequent")
    12. #注意,我们使用训练集数据来训练我们的填补器,本质是在生成训练集中的众数
    13. si.fit(Xtrain.loc[:,cate])
    14. #然后我们用训练集中的众数来同时填补训练集和测试集
    15. Xtrain.loc[:,cate] = si.transform(Xtrain.loc[:,cate])
    16. Xtest.loc[:,cate] = si.transform(Xtest.loc[:,cate])
    17. Xtrain.head()
    18. Xtest.head()
    19. #查看分类型特征是否依然存在缺失值
    20. Xtrain.loc[:,cate].isnull().mean()
    21. Xtest.loc[:,cate].isnull().mean()

    处理分类型变量:将分类型变量编码 

    1. #将所有的分类型变量编码为数字,一个类别是一个数字
    2. from sklearn.preprocessing import OrdinalEncoder
    3. oe = OrdinalEncoder()
    4. #利用训练集进行fit
    5. oe = oe.fit(Xtrain.loc[:,cate])
    6. #用训练集的编码结果来编码训练和测试特征矩阵
    7. #在这里如果测试特征矩阵报错,就说明测试集中出现了训练集中从未见过的类别
    8. Xtrain.loc[:,cate] = oe.transform(Xtrain.loc[:,cate])
    9. Xtest.loc[:,cate] = oe.transform(Xtest.loc[:,cate])
    10. Xtrain.loc[:,cate].head()
    11. Xtest.loc[:,cate].head()

    处理连续型变量:填补缺失值 

    1. col = Xtrain.columns.tolist()
    2. for i in cate:
    3. col.remove(i)
    4. col
    5. #实例化模型,填补策略为"mean"表示均值
    6. impmean = SimpleImputer(missing_values=np.nan,strategy = "mean")
    7. #用训练集来fit模型
    8. impmean = impmean.fit(Xtrain.loc[:,col])
    9. #分别在训练集和测试集上进行均值填补
    10. Xtrain.loc[:,col] = impmean.transform(Xtrain.loc[:,col])
    11. Xtest.loc[:,col] = impmean.transform(Xtest.loc[:,col])
    12. Xtrain.head()
    13. Xtest.head()

    处理连续型变量:无量纲化

    1. col.remove("Month")
    2. col
    3. from sklearn.preprocessing import StandardScaler
    4. ss = StandardScaler()
    5. ss = ss.fit(Xtrain.loc[:,col])
    6. Xtrain.loc[:,col] = ss.transform(Xtrain.loc[:,col])
    7. Xtest.loc[:,col] = ss.transform(Xtest.loc[:,col])
    8. Xtrain.head()
    9. Xtest.head()
    10. Ytrain.head()
    11. Ytest.head()

     建模与模型评估

    1. from time import time
    2. import datetime
    3. from sklearn.svm import SVC
    4. from sklearn.model_selection import cross_val_score
    5. from sklearn.metrics import roc_auc_score, recall_score
    6. Ytrain = Ytrain.iloc[:,0].ravel()
    7. Ytest = Ytest.iloc[:,0].ravel()
    8. #建模选择自然是我们的支持向量机SVC,首先用核函数的学习曲线来选择核函数
    9. #我们希望同时观察,精确性,recall以及AUC分数
    10. times = time() #因为SVM是计算量很大的模型,所以我们需要时刻监控我们的模型运行时间
    11. for kernel in ["linear","poly","rbf","sigmoid"]:
    12. clf = SVC(kernel = kernel
    13. ,gamma="auto"
    14. ,degree = 1
    15. ,cache_size = 5000
    16. ).fit(Xtrain, Ytrain)
    17. result = clf.predict(Xtest)
    18. score = clf.score(Xtest,Ytest)
    19. recall = recall_score(Ytest, result)
    20. auc = roc_auc_score(Ytest,clf.decision_function(Xtest))
    21. print("%s 's testing accuracy %f, recall is %f', auc is %f" %
    22. (kernel,score,recall,auc))
    23. print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))

     

    模型调参

    最求最高Recall

    1. times = time()
    2. for kernel in ["linear","poly","rbf","sigmoid"]:
    3. clf = SVC(kernel = kernel
    4. ,gamma="auto"
    5. ,degree = 1
    6. ,cache_size = 5000
    7. ,class_weight = "balanced"
    8. ).fit(Xtrain, Ytrain)
    9. result = clf.predict(Xtest)
    10. score = clf.score(Xtest,Ytest)
    11. recall = recall_score(Ytest, result)
    12. auc = roc_auc_score(Ytest,clf.decision_function(Xtest))
    13. print("%s 's testing accuracy %f, recall is %f', auc is %f" %
    14. (kernel,score,recall,auc))
    15. print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))

     以将class_weight调节得更加倾向于少数类,来不计代价提升recall

    1. times = time()
    2. clf = SVC(kernel = "linear"
    3. ,gamma="auto"
    4. ,cache_size = 5000
    5. ,class_weight = {1:10} #注意,这里写的其实是,类别1:10,隐藏了类别0:1这个比例
    6. ).fit(Xtrain, Ytrain)
    7. result = clf.predict(Xtest)
    8. score = clf.score(Xtest,Ytest)
    9. recall = recall_score(Ytest, result)
    10. auc = roc_auc_score(Ytest,clf.decision_function(Xtest))
    11. print("testing accuracy %f, recall is %f', auc is %f" %(score,recall,auc))
    12. print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))

    追求最高准确率

    1. valuec = pd.Series(Ytest).value_counts()
    2. valuec
    3. valuec[0]/valuec.sum()
    4. #查看模型的特异度
    5. from sklearn.metrics import confusion_matrix as CM
    6. clf = SVC(kernel = "linear"
    7. ,gamma="auto"
    8. ,cache_size = 5000
    9. ).fit(Xtrain, Ytrain)
    10. result = clf.predict(Xtest)
    11. cm = CM(Ytest,result,labels=(1,0))
    12. cm
    13. specificity = cm[1,1]/cm[1,:].sum()
    14. specificity #几乎所有的0都被判断正确了,还有不少1也被判断正确了
    15. irange = np.linspace(0.01,0.05,10)
    16. for i in irange:
    17. times = time()
    18. clf = SVC(kernel = "linear"
    19. ,gamma="auto"
    20. ,cache_size = 5000
    21. ,class_weight = {1:1+i}
    22. ).fit(Xtrain, Ytrain)
    23. result = clf.predict(Xtest)
    24. score = clf.score(Xtest,Ytest)
    25. recall = recall_score(Ytest, result)
    26. auc = roc_auc_score(Ytest,clf.decision_function(Xtest))
    27. print("under ratio 1:%f testing accuracy %f, recall is %f', auc is %f" %
    28. (1+i,score,recall,auc))
    29. print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))
    30. irange_ = np.linspace(0.018889,0.027778,10)
    31. for i in irange_:
    32. times = time()
    33. clf = SVC(kernel = "linear"
    34. ,gamma="auto"
    35. ,cache_size = 5000
    36. ,class_weight = {1:1+i}
    37. ).fit(Xtrain, Ytrain)
    38. result = clf.predict(Xtest)
    39. score = clf.score(Xtest,Ytest)
    40. recall = recall_score(Ytest, result)
    41. auc = roc_auc_score(Ytest,clf.decision_function(Xtest))
    42. print("under ratio 1:%f testing accuracy %f, recall is %f', auc is %f" %
    43. (1+i,score,recall,auc))
    44. print(datatime.datatime.fromtimesstamp(time()-times).strftime("%m:%s:%f"))

     追求平衡

    1. ###======【TIME WARNING:10mins】======###
    2. import matplotlib.pyplot as plt
    3. C_range = np.linspace(0.01,20,20)
    4. recallall = []
    5. aucall = []
    6. scoreall = []
    7. for C in C_range:
    8. times = time()
    9. clf = SVC(kernel = "linear",C=C,cache_size = 5000
    10. ,class_weight = "balanced"
    11. ).fit(Xtrain, Ytrain)
    12. result = clf.predict(Xtest)
    13. score = clf.score(Xtest,Ytest)
    14. recall = recall_score(Ytest, result)
    15. auc = roc_auc_score(Ytest,clf.decision_function(Xtest))
    16. recallall.append(recall)
    17. aucall.append(auc)
    18. scoreall.append(score)
    19. print("under C %f, testing accuracy is %f,recall is %f', auc is %f" %
    20. (C,score,recall,auc))
    21. print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))
    22. print(max(aucall),C_range[aucall.index(max(aucall))])
    23. plt.figure()
    24. plt.plot(C_range,recallall,c="red",label="recall")
    25. plt.plot(C_range,aucall,c="black",label="auc")
    26. plt.plot(C_range,scoreall,c="orange",label="accuracy")
    27. plt.legend()
    28. plt.show()

     

     附:

    各个特征代表含义

     

     

     

  • 相关阅读:
    PyTorch 迭代器读取数据
    十大经典管理定律,学会轻松带团队!
    千寻简Java词典音标版
    什么是指针?
    Win11运行虚拟机死机了?Win11运行VMware虚拟机崩溃的解决方法
    【ASP.NET】Hello World
    无人机为什么要用四个螺旋桨?
    机器学习8线性回归法Linear Regression
    MySQL 8.0安装教程
    【博客531】linux kubernetes网络非法报文校验参数以及追踪
  • 原文地址:https://blog.csdn.net/weixin_44267765/article/details/126926601