当前位置: 首页 > 科技观察

机器学习在房价预测中的应用

时间:2023-03-21 15:14:54 科技观察

前言Python在机器学习方面有着天然的优势,今天就来涉足一下机器学习技术。注释解释了为什么这样做。代码实现如下:Numpy&Pandas&Matplotlib&Ipython#NumPy(NumericalPython)是Python语言的扩展程序库,支持大量的维数组和矩阵运算,同时也提供了大量的数学运算数组操作的函数库。importnumpyasnp#Pandas可以对各种数据进行操作,例如合并、重塑、选择,以及数据清理和数据处理功能importpandasaspd#Matplotlib是Python的绘图库。它与NumPy一起工作,并提供了一个有效的开源替代MatLab导入matplotlib.pyplotasplt=pd.read_csv("train.csv")print(type(data))print(data.info())print(data.shape)print(data.head())print(data[['MSSubClass','LotArea']])dataset&missingvalue#选择数据集中的几个重要特征data_select=data[['BedroomAbvGr','LotArea','Neighborhood','SalePrice']]#对数据聚焦字段重命名data_select=data_select.rename(columns={'BedroomAbvGr':'room','LotArea':'area'})print(data_select)print(data_select.shape)print("*"*100)#判断缺失值一般使用isnull(),但是生成的所有数据的真假矩阵print(data_select.isnull())#df.isnull().any()会判断哪些“列”有缺失值print(data_select.isnull().any())#只显示打出缺失值的行和列,明确判断缺失值的位置print(data_select.isnull().values==True)#过滤缺失数据data_select=data_select.dropna(axis=0)print(data_select.shape)print(data_select.head())#print(np.take(data_select.columns,[0,1,3]))#print(type(np.take(data_select.columns,[0,1,3])))归一化处理#数量太大,归一化,让数据分布在同一区间,我们选择其中之一最简单的数据调整方法,将每个数字除以其最大值fornp.take(data_select.columns,[0,1,-1]):#print(col)#print(data_select[col])data_select[col]/=data_select[col].max()print(data_select.head())#分配测试数据和训练数据train,test=train_test_split(data_select.copy(),test_size=0.9)print(train.shape)print(test.shape)print(test.describe())#numpyinsideaxis=0andaxis=1示例描述:print("="*50)data=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])print(data)print(data.shape)#shape=[3,4]是3行4列print(np.sum(data))#如果numpy中没有指定axis,则默认添加所有数据print(np.sum(data,axis=0))#如果指定了axis=0,则按照第一个维度的方向为计算出来的,即3是根据t计算出来的列中3条数据,得到4组列数据的计算结果。print(np.sum(data,axis=1))#如果指定axis=1,则沿着第2个维度的方向计算,即根据行中的4条数据计算4,而得到3组行数据的计算结果。axis=0andaxis=1inprint("="*50)#pandas说明:#如果我们调用df.mean(axis=1),我们将得到行df=pd.DataFrame计算的平均值(np.arange(12).reshape(3,4))print(df)print(df.mean())#在pandas中,如果不指定axis,默认按axis=0计算print(df。意思是(axis=0))#如果指定axis=0,则按照第一个维度的变化方向计算,即根据列中的3条数据计算3,4组列的计算结果获取数据print(df.mean(axis=1))#如果指定axis=1,则按照第二维的变化方向计算,即根据行中的4条数据计算4,得到3组行数据的计算结果。线性回归模型#线性回归模型,假设h(x)=wx+b是线性的。deflinear(features,pars):print("theparsis:",pars)print(pars[:-1])price=np.sum(features*pars[:-1],axis=1)+pars[-1]returnpriceprint("*"*100)train['predict']=linear(train[['room','area']].values,np.array([0.1,0.1,0.0]))#可以看到在这个参数下,模型的预测价格和真实价格差距很大。然后我们需要找到合适的参数值Thingsprint(train.head())#预测函数为h(x)=wx+b#偏差的平方和函数:defmean_squared_error(pred_y,real_y):returnsum(np.array(pred_y-real_y)**2)#Lossfunction:deflost_function(df,features,pars):df['predict']=linear(df[features].values,pars)cost=mean_squared_error(df.predict,df.SalePrice)/len(df)returncostcost=lost_function(train,['room','area'],np.array([0.1,0.1,0.1]))print(cost)#linspace函数原型:linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)#作用是:在指定的大区间内,返回固定区间的数据它将在区间[start,stop]中返回“num”个等距样本。其中,区间的结束端点可以不包含,默认包含。num=100Xs=np.linspace(0,1,num)Ys=np.linspace(0,1,num)print(Xs)#Ifnum=5->[0.0.250.50.751.]print(Ys)#Ifnum=5->[0.0.250.50.751.]#zeros函数原型:zeros(shape,dtype=float,order='C')#功能:通常将数组转换成想要的矩阵;#例子:np.zeros((2,3),dtype=np.int)Zs=np.zeros([num,num])#100*100矩阵,所有值为0.print(Zs)#meshgridfromcoordinates返回向量中的坐标矩阵Xs,Ys=np.meshgrid(Xs,Ys)print(Xs.shape,Ys.shape)print(Xs)#如果num=5,则处理后的矩阵为:'''[[0.0.250.50.751.][0.0.250.50.751.][0.0.250.50.751.][0.0.250.50.751.][0.0.250.50.751.]]'''print(Ys)#如果num=5,则处理后的矩阵为:'''[[0.0.0.0.0.][0.250.250.250.250.25][0.50.50.50.50.5][0.750.750.750.750.75][1.1.1.1.1.]]'''W1=[]W2=[]Costs=[]foriinrange(100):forjinrange(100):W1.append(0.01*i)W2.append(0.01*j)Costs.append(lost_function(train,['room','area'],np.array([0.01*i,0.01*j,0.])))#numpy.argmin(a,axis=None,out=None)#a:矩阵#axis:integer,optional(如果不选则展开整个数组)(0:row,1column)#返回小值的下标index=np.array(lost_function).argmin()print(W1[index],W2[index],Costs[index])frommpl_toolkits.mplot3dimportAxes3Dfig=plt.figure()ax=fig.add_subplot(111,projection='3d')ax.view_init(5,-15)ax.scatter(W1,W2,Costs,s=10)ax.scatter(0.58,0.28,zs=lost_function(train,['room','area'],np.array([0.58,0.28,0.0])),s=100,color='red')plt.xlabel('房间')plt.ylabel('llotArea')plt.show()