注:本文是小编学习实战心得分享,欢迎交流讨论!话不多说,直接附上代码和图示说明。
目录
4.对列名进行分类,便于后面的操作,其中最后一列为预测标签数据
一、分段示例
1.导入必要的库
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport sklearn
2.读取数据,查看数据基本信息
可以看到,该数据文件大小为731*7,具体信息如图所示,并发现没有缺失值
df=pd.read_csv('C:/Users/27812/Desktop/2-day.csv')print(df.head(5))print(df.info())#查看后发现没有缺失值print(df.nunique())#除了前两列,其余每列都有重复值print(df.describe())#查看数据的描述性信息
3.简单查看有无重复值
print(df[all_colums].nunique())#提取重复值print(df[df.duplicated()])#结果发现无重复值
4.对列名进行分类,便于后面的操作,其中最后一列为预测标签数据
x_colums=['temp','atemp','hum','windspeed','casual','registered']y_colums=['cnt']all_colums=['temp','atemp','hum','windspeed','casual','registered','cnt']
5.对数据进行初步可视化
分别绘制直方图、散点图以及特征之间的相关表示图,对数据的分布以及特征之间的关系有了初步的了解或判断;同时检测异常值,并通过箱线图可视化。(展示部分图片)
#数据初步可视化#绘制直方图def hist(df): df.hist(figsize=(30,20)) plt.show() plt.savefig('a.png')hist(df[all_colums])#绘制散点图def scatter(df): for i in all_colums[:6]: plt.scatter(df[i],df['cnt']) plt.xlabel(i) plt.ylabel('cnt') plt.show()scatter(df)#相关系数查看特征与特征,特征与响应的线性关系def corr_view(): data_corr=df.corr() data_corr=data_corr.abs() sns.heatmap(data_corr,annot=True) plt.savefig('b.png')corr_view()#异常值可视化plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号for i in all_colums: f,ax=plt.subplots(figsize=(10,8)) sns.boxplot(y=i,data=df,ax=ax) plt.show() plt.savefig('c.png', dpi=500)#经发现,'hum','windspeed','casual'这三列中有异常值
6.清除异常值
#异常值处理# 通过Z-Score方法判断异常值,阙值设置为正负2# 复制一个用来存储Z-score得分的数据框,常用于原始对象和复制对象同时进行操作的场景df_zscore = df.copy() for col in all_colums: df_col = df[col] z_score = (df_col - df_col.mean()) / df_col.std() # 计算每列的Z-score得分 df_zscore[col] = z_score.abs() > 2 # 判断Z-score得分绝对值是否大于2,大于2即为异常值print(df_zscore)#显示为True的表示为异常值# 剔除异常值所在的行print(df[df_zscore['hum'] == False])print(df[df_zscore['windspeed'] == False])print(df[df_zscore['casual'] == False])#最终得到679x7的数列
7.将清洗完毕的数据,放进一个文件中
注意:新产生的这个文件,不能在打开的同时运行代码,否则因为占用文件而报错
#将清洗后的数据写入新的文件,命名为new_dfnew_df=df[df_zscore['casual'] == False]new_df.to_csv('new_df.csv')
8.特征选择
#特征选择#这里选择基于Filter(过滤法)中的卡方检验from sklearn.feature_selection import chi2, SelectKBestfeutures=['temp','atemp','hum','windspeed','casual','registered']X, y = new_df[feutures],new_df['cnt']chi2_model = SelectKBest(chi2, k=3)# 以下方法返回选择后的特征矩阵chi2_model.fit_transform(X, y)for i in range(X.shape[1]): print((chi2_model.scores_[i], chi2_model.pvalues_[i]))#可以发现,'casual','registered'这两个特征与目标'cnt'关系密切final_df=new_df.loc[:,['casual','registered','cnt']]final_df.to_csv('final_df.csv')#再将最终有效数据放入新文件final_df中
9.数据归一化
基于距离计算的算法模型,需要将数据归一化,便于模型的运算
#归一化;归一化通常有两种:最值归一化和均值方差归一化,这里采用均值方差归一化from sklearn import preprocessingfrom sklearn.preprocessing import StandardScalerscaler=preprocessing.StandardScaler().fit(final_df)final_df_scaler=scaler.transform(final_df)print(final_df_scaler)print(final_df_scaler.shape)#(679, 3)
10.进行训练集与测试集划分
#对新文件训练集与测试集划分from sklearn.model_selection import train_test_split#random_state:设置随机种子,保证每次运行生成相同的随机数train_set,test_set = train_test_split(final_df_scaler, test_size=0.2, random_state=42)x_train=train_set[:,0:2]y_train=train_set[:,2]x_test=test_set[:,0:2]y_test=test_set[:,2]print(x_train.shape)print(y_test.shape)print(y_train.dtype)
11.线性回归模型训练
#进行模型训练#1.线性回归from sklearn import linear_model#from sklearn import model_selectionfrom sklearn.linear_model import LinearRegressiondef test_LinearRegression(): linearRegression = linear_model.LinearRegression() #进行训练 linearRegression.fit(x_train, y_train) #通过LinearRegression的coef_属性获得权重向量,intercept_获得b的值 print("权重向量:%s, b的值为:%.2f" % (linearRegression.coef_, linearRegression.intercept_)) #计算出损失函数的值 print("损失函数的值: %.2f" % np.mean((linearRegression.predict(x_test) - y_test) ** 2)) #计算预测性能得分 print("预测性能得分: %.2f" % linearRegression.score(x_test, y_test))test_LinearRegression()#权重向量:[0.26697613 0.85123791], b的值为:-0.00#损失函数的值: 0.00#预测性能得分: 1.00
12.使用支持向量机(SVM)进行回归预测
注意:需将原数据类型float转化成整数类型int,否则会报错
#2.使用非线性支持向量机(SVM)进行回归预测from sklearn.svm import SVCfrom sklearn import metricssvm_model=SVC()#SVM分类器svm_model.fit(x_train.astype("int"),y_train.astype("int"))#注:需要将数据类型转化为int型prediction=svm_model.predict(x_test.astype("int"))print('准确率为:',metrics.accuracy_score(prediction, y_test.astype("int")))#准确率为: 0.9191176470588235
二、完整代码
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport sklearndf=pd.read_csv('C:/Users/27812/Desktop/2-day.csv')print(df.head(5))print(df.info())#查看后发现没有缺失值ssprint(df.nunique())#除了前两列,其余每列都有重复值print(df.describe())#查看数据的描述性信息x_colums=['temp','atemp','hum','windspeed','casual','registered']y_colums=['cnt']all_colums=['temp','atemp','hum','windspeed','casual','registered','cnt']print(df[all_colums].nunique())#提取重复值print(df[df.duplicated()])#无重复值'''#这步,若前面发现数值有缺失值,可用这个代码进一步查看缺失值情况print(df[category_colums].isnull().sum())print(df[numeric_colums].isnull().sum())#对缺失值进行标注为-1df[numeric_colums]=df[numeric_colums].fillna(-1)df[category_colums]=df[category_colums].fillna(-1)'''#数据初步可视化#绘制直方图def hist(df): df.hist(figsize=(30,20)) plt.show() plt.savefig('a.png')hist(df[all_colums])#绘制散点图def scatter(df): for i in all_colums[:6]: plt.scatter(df[i],df['cnt']) plt.xlabel(i) plt.ylabel('cnt') plt.show()scatter(df)#相关系数查看特征与特征,特征与响应的线性关系def corr_view(): data_corr=df.corr() data_corr=data_corr.abs() sns.heatmap(data_corr,annot=True) plt.savefig('b.png')corr_view()#异常值可视化plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号for i in all_colums: f,ax=plt.subplots(figsize=(10,8)) sns.boxplot(y=i,data=df,ax=ax) plt.show() plt.savefig('c.png', dpi=500)#经发现,'hum','windspeed','casual'这三列中有异常值#异常值处理# 通过Z-Score方法判断异常值,阙值设置为正负2# 复制一个用来存储Z-score得分的数据框,常用于原始对象和复制对象同时进行操作的场景df_zscore = df.copy() for col in all_colums: df_col = df[col] z_score = (df_col - df_col.mean()) / df_col.std() # 计算每列的Z-score得分 df_zscore[col] = z_score.abs() > 2 # 判断Z-score得分绝对值是否大于2,大于2即为异常值print(df_zscore)#显示为True的表示为异常值# 剔除异常值所在的行print(df[df_zscore['hum'] == False])print(df[df_zscore['windspeed'] == False])print(df[df_zscore['casual'] == False])#最终得到679x7的数列#将清洗后的数据写入新的文件,命名为new_dfnew_df=df[df_zscore['casual'] == False]new_df.to_csv('new_df.csv')#特征选择#这里选择基于Filter(过滤法)中的卡方检验from sklearn.feature_selection import chi2, SelectKBestfeutures=['temp','atemp','hum','windspeed','casual','registered']X, y = new_df[feutures],new_df['cnt']chi2_model = SelectKBest(chi2, k=3)# 以下方法返回选择后的特征矩阵chi2_model.fit_transform(X, y)for i in range(X.shape[1]): print((chi2_model.scores_[i], chi2_model.pvalues_[i]))#可以发现,'casual','registered'这两个特征与目标'cnt'关系密切final_df=new_df.loc[:,['casual','registered','cnt']]final_df.to_csv('final_df.csv')#再将最终有效数据放入新文件final_df中#归一化;归一化通常有两种:最值归一化和均值方差归一化,这里采用均值方差归一化from sklearn import preprocessingfrom sklearn.preprocessing import StandardScalerscaler=preprocessing.StandardScaler().fit(final_df)final_df_scaler=scaler.transform(final_df)print(final_df_scaler)print(final_df_scaler.shape)#(679, 3)#对新文件训练集与测试集划分from sklearn.model_selection import train_test_split#random_state:设置随机种子,保证每次运行生成相同的随机数train_set,test_set = train_test_split(final_df_scaler, test_size=0.2, random_state=42)x_train=train_set[:,0:2]y_train=train_set[:,2]x_test=test_set[:,0:2]y_test=test_set[:,2]print(x_train.shape)print(y_test.shape)print(y_train.dtype)#进行模型训练#1.线性回归from sklearn import linear_model#from sklearn import model_selectionfrom sklearn.linear_model import LinearRegressiondef test_LinearRegression(): linearRegression = linear_model.LinearRegression() #进行训练 linearRegression.fit(x_train, y_train) #通过LinearRegression的coef_属性获得权重向量,intercept_获得b的值 print("权重向量:%s, b的值为:%.2f" % (linearRegression.coef_, linearRegression.intercept_)) #计算出损失函数的值 print("损失函数的值: %.2f" % np.mean((linearRegression.predict(x_test) - y_test) ** 2)) #计算预测性能得分 print("预测性能得分: %.2f" % linearRegression.score(x_test, y_test))test_LinearRegression()#权重向量:[0.26697613 0.85123791], b的值为:-0.00#损失函数的值: 0.00#预测性能得分: 1.00#2.使用非线性支持向量机(SVM)进行回归预测from sklearn.svm import SVCfrom sklearn import metricssvm_model=SVC()#SVM分类器svm_model.fit(x_train.astype("int"),y_train.astype("int"))#注:需要将数据类型转化为int型prediction=svm_model.predict(x_test.astype("int"))print('准确率为:',metrics.accuracy_score(prediction, y_test.astype("int")))#准确率为: 0.9191176470588235
来源地址:https://blog.csdn.net/weixin_57501965/article/details/126593700