PyTorch进行气温预测
需要CSV文件私聊
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
import torch
import torch. optim as optim
import warnings
warnings. filterwarnings( "ignore" )
% matplotlib inline
features = pd. read_csv( 'temps.csv' )
features. head( )
import datetime
years = features[ 'year' ]
months = features[ 'month' ]
days = features[ 'day' ]
dates = [ str ( int ( year) ) + '-' + str ( int ( month) ) + '-' + str ( int ( day) ) for year, month, day in zip ( years, months, days) ]
dates = [ datetime. datetime. strptime( date, '%Y-%m-%d' ) for date in dates]
plt. style. use( 'fivethirtyeight' )
fig, ( ( ax1, ax2) , ( ax3, ax4) ) = plt. subplots( nrows= 2 , ncols= 2 , figsize = ( 10 , 10 ) )
fig. autofmt_xdate( rotation = 45 )
ax1. plot( dates, features[ 'actual' ] )
ax1. set_xlabel( '' ) ; ax1. set_ylabel( 'Temperature' ) ; ax1. set_title( 'Max Temp' )
ax2. plot( dates, features[ 'temp_1' ] )
ax2. set_xlabel( '' ) ; ax2. set_ylabel( 'Temperature' ) ; ax2. set_title( 'Previous Max Temp' )
ax3. plot( dates, features[ 'temp_2' ] )
ax3. set_xlabel( 'Date' ) ; ax3. set_ylabel( 'Temperature' ) ; ax3. set_title( 'Two Days Prior Max Temp' )
ax4. plot( dates, features[ 'friend' ] )
ax4. set_xlabel( 'Date' ) ; ax4. set_ylabel( 'Temperature' ) ; ax4. set_title( 'Friend Estimate' )
plt. tight_layout( pad= 2 )
features = pd. get_dummies( features)
features. head( 5 )
labels = np. array( features[ 'actual' ] )
features= features. drop( 'actual' , axis = 1 )
feature_list = list ( features. columns)
features = np. array( features)
from sklearn import preprocessing
input_features = preprocessing. StandardScaler( ) . fit_transform( features)
input_size = input_features. shape[ 1 ]
hidden_size = 128
output_size = 1
batch_size = 16
my_nn = torch. nn. Sequential(
torch. nn. Linear( input_size, hidden_size) ,
torch. nn. Sigmoid( ) ,
torch. nn. Linear( hidden_size, output_size) ,
)
cost = torch. nn. MSELoss( reduction= 'mean' )
optimizer = torch. optim. Adam( my_nn. parameters( ) , lr = 0.001 )
losses = [ ]
for i in range ( 1000 ) :
batch_loss = [ ]
for start in range ( 0 , len ( input_features) , batch_size) :
end = start + batch_size if start + batch_size < len ( input_features) else len ( input_features)
xx = torch. tensor( input_features[ start: end] , dtype = torch. float , requires_grad = True )
yy = torch. tensor( labels[ start: end] , dtype = torch. float , requires_grad = True )
prediction = my_nn( xx)
loss = cost( prediction, yy)
optimizer. zero_grad( )
loss. backward( retain_graph= True )
optimizer. step( )
batch_loss. append( loss. data. numpy( ) )
if i % 100 == 0 :
losses. append( np. mean( batch_loss) )
print ( i, np. mean( batch_loss) )
x = torch. tensor( input_features, dtype = torch. float )
predict = my_nn( x) . data. numpy( )
dates = [ str ( int ( year) ) + '-' + str ( int ( month) ) + '-' + str ( int ( day) ) for year, month, day in zip ( years, months, days) ]
dates = [ datetime. datetime. strptime( date, '%Y-%m-%d' ) for date in dates]
true_data = pd. DataFrame( data = { 'date' : dates, 'actual' : labels} )
months = features[ : , feature_list. index( 'month' ) ]
days = features[ : , feature_list. index( 'day' ) ]
years = features[ : , feature_list. index( 'year' ) ]
test_dates = [ str ( int ( year) ) + '-' + str ( int ( month) ) + '-' + str ( int ( day) ) for year, month, day in zip ( years, months, days) ]
test_dates = [ datetime. datetime. strptime( date, '%Y-%m-%d' ) for date in test_dates]
predictions_data = pd. DataFrame( data = { 'date' : test_dates, 'prediction' : predict. reshape( - 1 ) } )
plt. plot( true_data[ 'date' ] , true_data[ 'actual' ] , 'b-' , label = 'actual' )
plt. plot( predictions_data[ 'date' ] , predictions_data[ 'prediction' ] , 'ro' , label = 'prediction' )
plt. xticks( rotation = '60' ) ;
plt. legend( )
plt. xlabel( 'Date' ) ; plt. ylabel( 'Maximum Temperature (F)' ) ; plt. title( 'Actual and Predicted Values' ) ;